JavaRush /จาวาบล็อก /Random-TH /พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java ส่วนที่ 2 จาก 3
Ярослав
ระดับ
Днепр

พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java ส่วนที่ 2 จาก 3

เผยแพร่ในกลุ่ม

การแนะนำ

สวัสดีผู้อ่านบทความของฉัน นี่เป็นบทความที่สองในชุดเกี่ยวกับ XML และบทความนี้จะพูดถึง XML Namespace และ XML Schema
พื้นฐาน XML
เมื่อเร็ว ๆ นี้ตัวฉันเองไม่รู้อะไรเลยเกี่ยวกับเรื่องนี้ แต่ฉันเชี่ยวชาญเนื้อหามากมายและจะพยายามอธิบายหัวข้อสำคัญทั้งสองนี้ด้วยคำพูดง่ายๆ ฉันอยากจะบอกทันทีว่าสคีมาเป็นกลไกขั้นสูงในการตรวจสอบเอกสาร XML และทำงานได้ดีกว่า DTD มาก ดังนั้นจึงไม่มีการศึกษาแบบสมบูรณ์เกี่ยวกับเอกสารเหล่านี้ที่นี่ มาเริ่มกันเลย :)

เนมสเปซ XML

เนมสเปซหมายถึง "เนมสเปซ" อย่างไรก็ตามในบทความนี้ฉันมักจะแทนที่สำนวนภาษารัสเซียด้วยเนมสเปซแบบง่ายๆ เพราะมันสั้นกว่าและเข้าใจง่ายกว่า XML Namespace เป็นเทคโนโลยีที่มีวัตถุประสงค์หลักเพื่อให้แน่ใจว่าองค์ประกอบทั้งหมดไม่ซ้ำกันในไฟล์ XML และไม่มีความสับสน และเนื่องจากหลักสูตรเหล่านี้เป็นหลักสูตร Java เทคโนโลยีเดียวกันนี้จึงมีอยู่ในแพ็คเกจ Java ด้วยเช่นกัน หากเราสามารถวางสองคลาสที่มีชื่อเดียวกันติดกันและใช้มันได้ เราจะกำหนดได้อย่างไรว่าเราต้องการคลาสใด? ปัญหานี้แก้ไขได้ด้วยแพ็คเกจ - เราสามารถวางคลาสในแพ็คเกจที่แตกต่างกันและนำเข้าจากที่นั่น โดยระบุชื่อที่แน่นอนของแพ็คเกจที่ต้องการและเส้นทางไปยังมัน หรือเพียงแค่ระบุเส้นทางแบบเต็มไปยังคลาสที่ต้องการ พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java  ส่วนที่ 2 จาก 3 - 1ตอนนี้เราสามารถทำสิ่งนี้ได้:
public class ExampleInvocation {
    public static void main(String[] args) {
        // Creation экземпляра класса из первого пакета.
        example_package_1.Example example1 = new example_package_1.Example();

        // Creation экземпляра класса из второго пакета.
        example_package_2.Example example2 = new example_package_2.Example();

        // Creation экземпляра класса из третьего пакета.
        example_package_3.Example example3 = new example_package_3.Example();
    }
}
ใน XML Namespace ทุกอย่างค่อนข้างจะเหมือนกัน ต่างกันเพียงเล็กน้อยเท่านั้น สาระสำคัญเหมือนกัน: หากองค์ประกอบเหมือนกัน (เช่นคลาส) เราก็ต้องใช้พวกมันในเนมสเปซที่แตกต่างกัน (ระบุแพ็คเกจ) แม้ว่าชื่อขององค์ประกอบ (คลาส) จะเริ่มตรงกัน แต่เราก็จะยังคงอยู่ เข้าถึงองค์ประกอบเฉพาะจากช่องว่าง ( แพ็คเกจ) ตัวอย่างเช่น เรามีสององค์ประกอบใน XML - การทำนาย (oracle) และฐานข้อมูล Oracle
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <oracle>
        <connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
        <user value="root" />
        <password value="111" />
    </oracle>

    <oracle>
        Сегодня вы будете заняты весь день.
    </oracle>
</root>
และเมื่อเราประมวลผลไฟล์ XML นี้ เราจะสับสนอย่างมากหากเราได้รับการคาดการณ์แทนฐานข้อมูล และในทางกลับกันด้วย เพื่อแก้ไขการชนกันขององค์ประกอบ เราสามารถจัดสรรพื้นที่ให้แต่ละองค์ประกอบแยกความแตกต่างได้ มีคุณลักษณะพิเศษสำหรับสิ่งนี้ – xmlns:prefix= “unique value for namespace” จากนั้นเราสามารถนำหน้าองค์ประกอบเพื่อระบุว่าเป็นส่วนหนึ่งของเนมสเปซนั้น (โดยพื้นฐานแล้ว เราต้องสร้างเส้นทางแพ็คเกจ - เนมสเปซ จากนั้นนำหน้าแต่ละองค์ประกอบด้วยแพ็คเกจที่เป็นของ)
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <database:oracle xmlns:database="Unique ID #1">
        <connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
        <user value="root" />
        <password value="111" />
    </database:oracle>

    <oracle:oracle xmlns:oracle="Unique ID #2">
        Сегодня вы будете заняты весь день.
    </oracle:oracle>
</root>
ในตัวอย่างนี้ เราได้ประกาศสองเนมสเปซ: ฐานข้อมูลและออราเคิล ตอนนี้คุณสามารถใช้คำนำหน้าเนมสเปซก่อนองค์ประกอบได้ ไม่จำเป็นต้องกลัวหากมีบางสิ่งที่ไม่ชัดเจนในขณะนี้ ที่จริงแล้วมันง่ายมาก ตอนแรกฉันต้องการเขียนบทความนี้ให้เร็วขึ้น แต่หลังจากวันพุธฉันตัดสินใจว่าจะต้องให้ความสำคัญกับหัวข้อนี้มากขึ้นเนื่องจากอาจสับสนหรือไม่เข้าใจบางสิ่งบางอย่างได้ง่าย ตอนนี้ความสนใจอย่างมากจะจ่ายให้กับแอตทริบิวต์ xmlns และอีกตัวอย่างหนึ่ง:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
    <gun:shop>
        <gun:guns>
            <gun:gun name="Revolver" price="1250$" max_ammo="7" />
            <gun:gun name="M4A1" price="3250$" max_ammo="30" />
            <gun:gun name="9mm Pistol" price="450$" max_ammo="12" />
        </gun:guns>
    </gun:shop>

    <fish:shop>
        <fish:fishes>
            <fish:fish name="Shark" price="1000$" />
            <fish:fish name="Tuna" price="5$" />
            <fish:fish name="Capelin" price="1$" />
        </fish:fishes>
    </fish:shop>
</root>
คุณสามารถดู XML ปกติได้โดยใช้ปืนอวกาศสำหรับองค์ประกอบเฉพาะของร้านปืน และองค์ประกอบเฉพาะของปลาสำหรับร้านตกปลา คุณจะเห็นว่าด้วยการสร้างพื้นที่ เราใช้องค์ประกอบร้านค้าหนึ่งสำหรับสองสิ่งที่แตกต่างกันในคราวเดียว - ร้านขายอาวุธและร้านขายปลา และเรารู้ว่าเป็นร้านค้าประเภทใดต้องขอบคุณความจริงที่ว่าเราประกาศช่องว่าง สิ่งที่น่าสนใจที่สุดจะเริ่มต้นในโครงร่าง เมื่อเราสามารถตรวจสอบความถูกต้องของโครงสร้างที่แตกต่างกันด้วยองค์ประกอบเดียวกันในลักษณะนี้ได้ xmlns เป็นแอตทริบิวต์สำหรับการประกาศเนมสเปซ ซึ่งสามารถระบุได้ในองค์ประกอบใดก็ได้ ตัวอย่างการประกาศเนมสเปซ:
xmlns:shop= «https://barber-shop.com/»
หลังจากเครื่องหมายทวิภาคเป็นคำนำหน้า - นี่คือการอ้างอิงช่องว่างที่สามารถนำมาใช้ก่อนองค์ประกอบเพื่อระบุว่ามาจากช่องว่างนั้น ค่า xmlns ต้องเป็น UNIQUE STRING สิ่งนี้สำคัญอย่างยิ่งที่ต้องทำความเข้าใจ: เป็นเรื่องปกติมากที่จะใช้ลิงก์ของเว็บไซต์หรือ URI เพื่อประกาศเนมสเปซ กฎนี้เป็นกฎมาตรฐานเนื่องจาก URI หรือ URL ของลิงก์ไม่ซ้ำกัน แต่ทำให้เกิดความสับสนอย่างมาก เพียงจำไว้ว่า: ค่าอาจเป็นสตริงใดก็ได้ที่คุณต้องการ แต่เพื่อให้แน่ใจว่าค่านั้นไม่ซ้ำกันและเป็นมาตรฐาน คุณจะต้องใช้ URL หรือ URI ความจริงที่ว่าคุณสามารถใช้สตริงใดๆ ก็ได้แสดงอยู่ในตัวอย่างใน oracle:
xmlns:oracle="Unique ID #2"
xmlns:database="Unique ID #1"
เมื่อคุณประกาศเนมสเปซ คุณสามารถใช้เนมสเปซกับองค์ประกอบนั้นเองและกับองค์ประกอบทั้งหมดที่อยู่ภายในได้ ดังนั้นเนมสเปซที่ประกาศบนองค์ประกอบรูทจึงสามารถใช้กับองค์ประกอบทั้งหมดได้ สามารถดูได้ในตัวอย่างสุดท้าย และนี่คือตัวอย่างที่เจาะจงมากขึ้น:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <el1:element1 xmlns:el1="Element#1 Unique String">
        <el1:innerElement>

        </el1:innerElement>
    </el1:element1>


    <el2:element2 xmlns:el2="Element#2 Unique String">
        <el2:innerElement>

        </el2:innerElement>
    </el2:element2>


    <el3:element3 xmlns:el3="Element#3 Unique String">
        <el3:innerElement>
            <el1:innerInnerElement> <!-- Так нельзя, потому что пространство el1 объявлено только в первом элементе, потому может использовать только внутри первого element и его внутренних элементов. -->

            </el1:innerInnerElement>
        </el3:innerElement>
    </el3:element3>
</root>
นี่คือรายละเอียดที่สำคัญ: นอกจากนี้ยังมีเนมสเปซมาตรฐานในองค์ประกอบรูทด้วย หากคุณประกาศเนมสเปซอื่น คุณจะแทนที่เนมสเปซเริ่มต้นและจะไม่สามารถใช้งานได้ จากนั้นคุณจะต้องใส่คำนำหน้าช่องว่างด้านหน้าองค์ประกอบรูท ใดๆ ก็ตามที่คุณประกาศไว้ก่อนหน้านี้ อย่างไรก็ตาม สิ่งนี้อาจถูกหลอกได้เช่นกัน: คุณสามารถประกาศพื้นที่มาตรฐานได้อย่างชัดเจน แค่ไม่ใช้คำนำหน้าหลัง xmlns ก็เพียงพอแล้ว แต่ให้เขียนค่าบางส่วนทันที และองค์ประกอบทั้งหมดของคุณที่ไม่มีคำนำหน้าจะเป็นของเนมสเปซเฉพาะนี้ ตัวอย่างสุดท้ายใช้สิ่งนี้:
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
เราประกาศพื้นที่มาตรฐานอย่างชัดเจนเพื่อหลีกเลี่ยงความจำเป็นในการใช้ปืนหรือปลา เนื่องจากองค์ประกอบรากไม่ใช่ตัวตนของร้านขายอุปกรณ์ตกปลาหรืออาวุธ ดังนั้นการใช้ช่องว่างอย่างใดอย่างหนึ่งจึงไม่ถูกต้องตามหลักตรรกะ ถัดไป: หากคุณสร้าง xmlns:a และ xmlns:b แต่มีค่าเท่ากัน นี่จะเป็นพื้นที่เดียวกันและจะไม่ซ้ำกัน นั่นเป็นเหตุผลที่คุณควรใช้ค่าที่ไม่ซ้ำเสมอ เนื่องจากการละเมิดกฎนี้อาจทำให้เกิดข้อผิดพลาดจำนวนมากได้ ตัวอย่างเช่น หากเราประกาศช่องว่างดังนี้:
xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.gun-shop.com/"
จากนั้นร้านตกปลาของเราก็จะกลายเป็นร้านขายอาวุธ และคำนำหน้าก็ยังเป็นร้านขายปลา เหล่านี้ล้วนเป็นประเด็นหลักของช่องว่าง ฉันใช้เวลาค่อนข้างมากในการรวบรวมพวกมันทั้งหมดและลดพวกมันลง จากนั้นแสดงออกอย่างชัดเจน เนื่องจากข้อมูลบนอวกาศบนอินเทอร์เน็ตมีขนาดใหญ่มากและมักจะเป็นเพียงน้ำ ดังนั้นทุกสิ่งส่วนใหญ่ที่นี่ - ฉันเรียนรู้ด้วยตัวเองผ่านการทดลองใช้ และข้อผิดพลาด หากคุณยังคงมีคำถาม คุณสามารถลองอ่านเนื้อหาโดยใช้ลิงก์ท้ายบทความ

XML สคีมา

ฉันอยากจะบอกทันทีว่าบทความนี้จะเป็นเพียงส่วนเล็ก ๆ เท่านั้นเนื่องจากหัวข้อกว้างมาก หากคุณต้องการทำความคุ้นเคยกับโครงร่างโดยละเอียดมากขึ้นและเรียนรู้วิธีเขียนความซับซ้อนใด ๆ ในตอนท้ายของบทความจะมีลิงก์ที่ทุกอย่างจะเกี่ยวกับประเภทข้อ จำกัด ส่วนขยายและอื่น ๆ ฉันต้องการเริ่มต้นด้วยทฤษฎี แบบแผนมีรูปแบบ .xsd (คำจำกัดความแบบแผน xml) และเป็นทางเลือกขั้นสูงและเป็นที่นิยมมากกว่าสำหรับ DTD: นอกจากนี้ยังสามารถสร้างองค์ประกอบ อธิบาย และอื่นๆ ได้ อย่างไรก็ตาม มีการเพิ่มโบนัสมากมาย: การตรวจสอบประเภท การรองรับเนมสเปซ และฟังก์ชันการทำงานที่กว้างขึ้น จำได้ไหมเมื่อเราพูดถึง DTD มีข้อเสียคือมันไม่รองรับช่องว่าง ตอนนี้เราได้ศึกษาสิ่งนี้แล้ว ผมจะอธิบาย: หากเป็นไปได้ที่จะนำเข้าสคีมาสองรายการขึ้นไปจาก DTD ซึ่งมีองค์ประกอบที่เหมือนกัน เราจะเกิดการชนกัน (บังเอิญ) และจะไม่สามารถใช้งานได้เลย เนื่องจาก ยังไม่ชัดเจนว่าเราต้องการองค์ประกอบใด XSD แก้ปัญหานี้เนื่องจากคุณสามารถนำเข้าสคีมาไปยังพื้นที่เฉพาะและใช้งานได้ โดยพื้นฐานแล้ว สคีมา XSD ทุกอันมีพื้นที่เป้าหมาย ซึ่งหมายความว่าควรเขียนสคีมาในไฟล์ XML ในพื้นที่ใด ดังนั้นในไฟล์ XML เราเพียงแค่ต้องสร้างช่องว่างเหล่านี้ที่กำหนดไว้ล่วงหน้าในสคีมาและกำหนดคำนำหน้าให้กับช่องว่างเหล่านั้น จากนั้นเชื่อมต่อสคีมาที่จำเป็นกับแต่ละสคีมา หลังจากนั้นเราสามารถใช้องค์ประกอบจากสคีมาได้อย่างปลอดภัย โดยแทนที่คำนำหน้าจาก พื้นที่ที่เรานำเข้าแผนงาน ดังนั้นเราจึงมีตัวอย่าง:
<?xml version="1.0" encoding="UTF-8"?>
<house>
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</house>
เราต้องการตรวจสอบความถูกต้องด้วยสคีมา ก่อนอื่น เราต้องการสคีมา:
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.nedvigimost.com/">
    <element name="house">
        <complexType>
            <sequence>
                <element name="address" type="string" maxOccurs="unbounded" minOccurs="0" />
                <element name="owner" maxOccurs="unbounded" minOccurs="0" >
                    <complexType>
                        <sequence>
                            <element name="telephone" type="string" />
                        </sequence>
                        <attribute name="name" type="string" use="required"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>
อย่างที่คุณเห็น สคีมาก็เป็นไฟล์ XML เช่นกัน คุณเขียนสิ่งที่คุณต้องการโดยตรงในรูปแบบ XML สคีมานี้สามารถตรวจสอบไฟล์ XML จากตัวอย่างด้านบนได้ เช่น ถ้าเจ้าของไม่มีชื่อ วงจรก็จะเห็นแบบนี้ นอกจากนี้ ต้องขอบคุณองค์ประกอบลำดับ ที่อยู่จึงควรมาก่อนเสมอ และตามด้วยเจ้าของบ้าน มีองค์ประกอบธรรมดาและซับซ้อน องค์ประกอบปกติคือองค์ประกอบที่เก็บข้อมูลเพียงบางประเภทเท่านั้น ตัวอย่าง:
<element name="telephone" type="string" />
นี่คือวิธีที่เราประกาศองค์ประกอบที่เก็บสตริง ไม่ควรมีองค์ประกอบอื่นภายในองค์ประกอบนี้ นอกจากนี้ยังมีองค์ประกอบที่ซับซ้อน องค์ประกอบที่ซับซ้อนสามารถจัดเก็บองค์ประกอบและคุณลักษณะอื่น ๆ ภายในตัวเองได้ จากนั้นคุณไม่จำเป็นต้องระบุประเภท แต่เพียงเริ่มเขียนประเภทที่ซับซ้อนภายในองค์ประกอบ
<complexType>
    <sequence>
        <element name="address" type="string" maxOccurs="unbounded" minOccurs="0" />
        <element name="owner" maxOccurs="unbounded" minOccurs="0" >
            <complexType>
                <sequence>
                    <element name="telephone" type="string" />
                </sequence>
                <attribute name="name" type="string" use="required"/>
            </complexType>
        </element>
    </sequence>
</complexType>
นอกจากนี้ยังเป็นไปได้ที่จะทำแตกต่างออกไป: คุณสามารถสร้างประเภทที่ซับซ้อนแยกจากกัน แล้วแทนที่เป็นประเภท ในขณะที่เขียนตัวอย่างนี้เท่านั้น ด้วยเหตุผลบางประการจึงจำเป็นต้องประกาศช่องว่างภายใต้คำนำหน้าบางประเภท และไม่ใช้ช่องมาตรฐาน โดยทั่วไปแล้วปรากฎดังนี้:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.nedvigimost.com/">
    <xs:element name="house" type="content" />

    <xs:complexType name="content">
        <xs:sequence>
            <xs:element name="address" type="xs:string" maxOccurs="unbounded" minOccurs="0" />
            <xs:element name="owner" maxOccurs="unbounded" minOccurs="0" >
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="telephone" type="xs:string" />
                    </xs:sequence>
                    <xs:attribute name="name" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
ด้วยวิธีนี้ เราสามารถสร้างประเภทของเราเองแยกกัน จากนั้นแทนที่มันที่ไหนสักแห่งในแอตทริบิวต์ type สะดวกมากเพราะช่วยให้คุณใช้ประเภทเดียวในสถานที่ต่างๆได้ ฉันอยากจะพูดเพิ่มเติมเกี่ยวกับการต่อวงจรและจบที่นี่ มีสองวิธีในการเชื่อมต่อวงจร: เข้าไปในพื้นที่เฉพาะและเพียงแค่เชื่อมต่อ

วิธีแรกในการเชื่อมต่อวงจร

วิธีแรกถือว่าวงจรมีพื้นที่เป้าหมายเฉพาะ มันถูกระบุโดยใช้แอตทริบิวต์ targetNamespace บนองค์ประกอบโครงร่าง การสร้างพื้นที่เดียวกันนี้ในไฟล์ XML ก็เพียงพอแล้ว จากนั้นจึง "โหลด" สคีมาที่นั่น:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="https://www.nedvigimost.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.nedvigimost.com/ example_schema1.xsd">
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</nedvig:house>
สิ่งสำคัญคือต้องเข้าใจสองบรรทัด:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemeLocation="https://www.nedvigimost.com/ example_schema1.xsd"
บรรทัดแรก - แค่จำไว้ คิดว่ามันเป็นออบเจ็กต์ที่ช่วยโหลดแผนงานในตำแหน่งที่ต้องการ บรรทัดที่สองคือการดาวน์โหลดเฉพาะ schemaLocation ยอมรับรายการค่าในรูปแบบ "ค่า - ค่า" คั่นด้วยช่องว่าง อาร์กิวเมนต์แรกคือเนมสเปซ ซึ่งจะต้องตรงกับเนมสเปซเป้าหมายในสคีมา (ค่า targetNamespace) อาร์กิวเมนต์ที่สองคือเส้นทางสัมพัทธ์หรือสัมบูรณ์ไปยังสคีมา และเนื่องจากนี่คือค่า LIST คุณจึงสามารถเว้นวรรคหลังโครงร่างในตัวอย่าง และป้อนช่องว่างเป้าหมายและชื่อของโครงร่างอื่นอีกครั้ง และอื่นๆ ได้มากเท่าที่คุณต้องการ สำคัญ:เพื่อให้สคีมาตรวจสอบความถูกต้องในภายหลัง คุณต้องประกาศพื้นที่นี้และใช้กับคำนำหน้า ดูตัวอย่างสุดท้ายอย่างละเอียด:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="https://www.nedvigimost.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.nedvigimost.com/ example_schema1.xsd">
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</nedvig:house>
เราสร้างพื้นที่เป้าหมายนี้บนคำนำหน้า nedvig แล้วจึงใช้งาน ดังนั้น องค์ประกอบของเราจึงเริ่มได้รับการตรวจสอบ เนื่องจากเราเริ่มใช้พื้นที่ที่มีการอ้างอิงพื้นที่สคีมาเป้าหมาย

วิธีที่สองในการเชื่อมต่อวงจร

วิธีที่สองในการเชื่อมต่อวงจรแสดงว่าวงจรไม่มีพื้นที่เป้าหมายเฉพาะ จากนั้นคุณก็สามารถเชื่อมต่อกับไฟล์ XML และมันจะตรวจสอบความถูกต้อง ทำได้ในลักษณะเดียวกันเกือบทั้งหมด มีเพียงคุณเท่านั้นที่ไม่สามารถประกาศช่องว่างในไฟล์ XML ได้ แต่เพียงเชื่อมต่อสคีมา
<?xml version="1.0" encoding="UTF-8"?>
<house xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="example_schema1.xsd">
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</house>
อย่างที่คุณเห็น การดำเนินการนี้ทำได้โดยใช้ noNamespaceSchemaLocation และระบุเส้นทางไปยังสคีมา แม้ว่าสคีมาไม่มีพื้นที่เป้าหมาย เอกสารก็จะได้รับการตรวจสอบ และสัมผัสสุดท้าย: เราสามารถนำเข้าไดอะแกรมอื่นลงในไดอะแกรม แล้วใช้องค์ประกอบจากไดอะแกรมหนึ่งไปยังอีกไดอะแกรมหนึ่งได้ ดังนั้นเราจึงสามารถใช้องค์ประกอบในบางวงจรที่มีอยู่แล้วในวงจรอื่นได้ ตัวอย่าง:

สคีมาที่มีการประกาศประเภทเจ้าของ:

<?xml version="1.0" encoding="UTF-8" ?>
<schema targetNamespace="bonus" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
        <complexType name="owner">
            <all>
                <element name="telephone" type="string" />
            </all>
            <attribute name="name" type="string" />
        </complexType>
</schema>

สคีมาที่สอง ซึ่งใช้ประเภทเจ้าของจากสคีมาแรก:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="main" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:bonus="bonus" elementFormDefault="qualified">
    <import namespace="bonus" schemaLocation="xsd2.xsd" />
    <element name="house">
        <complexType>
            <all>
              <element name="address" type="string" />
                <element name="owner" type="bonus:owner" />
            </all>
        </complexType>
    </element>
</schema>
โครงการที่สองใช้โครงสร้างต่อไปนี้:
<import namespace="bonus" schemaLocation="xsd2.xsd" />
เมื่อใช้มัน เราได้นำเข้าประเภทและองค์ประกอบจากสคีมาหนึ่งไปยังอีกสคีมามาไว้ในพื้นที่โบนัส ดังนั้นเราจึงสามารถเข้าถึงโบนัส:ประเภทเจ้าของ และในบรรทัดถัดไปเราใช้มัน:
<element name="owner" type="bonus:owner" />
ให้ความสนใจเล็กน้อยในบรรทัดต่อไปนี้:
elementFormDefault="qualified"
คุณลักษณะนี้ได้รับการประกาศในสคีมา และหมายความว่าในไฟล์ XML แต่ละองค์ประกอบจะต้องได้รับการประกาศด้วยคำนำหน้าที่ชัดเจนก่อนหน้านั้น หากไม่มีอยู่ เราก็จำเป็นต้องประกาศองค์ประกอบภายนอกด้วยคำนำหน้า และเรายังต้องตั้งค่าคำนำหน้าในองค์ประกอบทั้งหมดภายในด้วย ซึ่งระบุอย่างชัดเจนว่าเรากำลังใช้องค์ประกอบของโครงร่างนี้ทุกประการ และนี่คือตัวอย่างไฟล์ XML ที่ได้รับการตรวจสอบโดยสคีมาซึ่งนำเข้าสคีมาอื่น:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="main" xmlns:bonus="bonus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="main xsd.xsd">
    <nedvig:address>ул. Есенина, дом №5</nedvig:address>
    <nedvig:owner name="Ivan">
        <bonus:telephone>+38-094-521-77-35</bonus:telephone>
    </nedvig:owner>
</nedvig:house>
ในบรรทัด:
<bonus:telephone>+38-094-521-77-35</bonus:telephone>
เราจำเป็นต้องประกาศเนมสเปซโบนัสอย่างชัดเจน ซึ่งชี้ไปยังพื้นที่เป้าหมายของสคีมาแรก เนื่องจาก elementFormDefault มีคุณสมบัติ (ตรวจสอบ) ดังนั้นองค์ประกอบทั้งหมดจะต้องระบุพื้นที่อย่างชัดเจน

ท้ายบทความ

บทความถัดไปจะเป็นบทความสุดท้ายในชุดและจะเกี่ยวกับการประมวลผลไฟล์ XML โดยใช้ Java อยู่แล้ว เราจะเรียนรู้ที่จะรับข้อมูลในรูปแบบต่างๆ เป็นต้น ฉันหวังว่าบทความนี้จะมีประโยชน์และแม้ว่าจะมีข้อผิดพลาดอยู่บ้าง แต่ก็จะสอนสิ่งที่มีประโยชน์และใหม่แก่คุณหรืออาจเปิดโอกาสให้คุณเข้าใจไฟล์ XML ได้ดีขึ้น สำหรับผู้ที่ต้องการศึกษารายละเอียดเพิ่มเติม ฉันตัดสินใจรวบรวมลิงก์ชุดเล็กๆ ไว้ด้วยกัน:
  • XSD Simple Elements - เริ่มอ่านจากบทความนี้และก้าวไปข้างหน้า ข้อมูลทั้งหมดเกี่ยวกับโครงร่างจะถูกรวบรวมไว้ที่นั่นและมีการอธิบายอย่างชัดเจนไม่มากก็น้อยเฉพาะในภาษาอังกฤษเท่านั้น คุณสามารถใช้นักแปลได้

  • วิดีโอบนเนมสเปซ การฟังมุมมองอื่นเกี่ยวกับบางสิ่งบางอย่างจะมีประโยชน์เสมอหากมุมมองแรกไม่ชัดเจน

  • เนมสเปซ XMLเป็นตัวอย่างที่ดีของการใช้เนมสเปซและค่อนข้างครอบคลุม

  • พื้นฐาน XML - เนมสเปซ - บทความสั้น ๆ อีกบทความเกี่ยวกับเนมสเปซ

  • พื้นฐานของการใช้ XML Schema เพื่อกำหนดองค์ประกอบยังเป็นข้อมูลอ้างอิงที่มีประโยชน์อย่างยิ่งเกี่ยวกับ schema แต่คุณต้องอ่านอย่างช้าๆ และรอบคอบ โดยเจาะลึกเนื้อหา

ทั้งหมดนี้แน่นอน ฉันหวังว่าหากคุณต้องการเรียนรู้อะไรที่ลึกซึ้งกว่านี้ ลิงก์จะช่วยคุณได้ ฉันอ่านแหล่งข้อมูลเหล่านี้ทั้งหมดด้วยตัวเอง ศึกษาเนื้อหาทั้งหมด และโดยรวมแล้ว แหล่งข้อมูลเหล่านี้มีประโยชน์มากที่สุดในบรรดาแหล่งข้อมูลทั้งหมดที่ฉันดู เนื่องจากแต่ละแหล่งข้อมูลได้ปรับปรุงความเข้าใจในสิ่งที่ฉันได้อ่านไปแล้วจากที่อื่น หรือ ให้ฉันเรียนรู้สิ่งใหม่ แต่มีหลายอย่างเกิดขึ้นระหว่างการฝึกซ้อม ดังนั้น สำหรับผู้ที่ต้องการเข้าใจทั้งหมดนี้เป็นอย่างดี คำแนะนำของฉันคือ: ศึกษาเนมสเปซ จากนั้นวิธีเชื่อมต่อสคีมากับไฟล์ XML อย่างง่ายดาย และวิธีการเขียนโครงสร้างเอกสารในสคีมา และที่สำคัญที่สุดคือการฝึกฝน ขอขอบคุณทุกท่านที่ให้ความสนใจและโชคดีในการเขียนโปรแกรม :) บทความก่อนหน้า: [การแข่งขัน] พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java - ส่วนที่ 1 จาก 3 บทความถัดไป: [การแข่งขัน] พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java - ส่วนที่ 3.1 จาก 3 - SAX
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION