การแนะนำ
สวัสดีผู้อ่านบทความของฉัน นี่เป็นบทความที่สองในชุดเกี่ยวกับ XML และบทความนี้จะพูดถึง XML Namespace และ XML Schemaเนมสเปซ XML
เนมสเปซหมายถึง "เนมสเปซ" อย่างไรก็ตามในบทความนี้ฉันมักจะแทนที่สำนวนภาษารัสเซียด้วยเนมสเปซแบบง่ายๆ เพราะมันสั้นกว่าและเข้าใจง่ายกว่า XML Namespace เป็นเทคโนโลยีที่มีวัตถุประสงค์หลักเพื่อให้แน่ใจว่าองค์ประกอบทั้งหมดไม่ซ้ำกันในไฟล์ XML และไม่มีความสับสน และเนื่องจากหลักสูตรเหล่านี้เป็นหลักสูตร Java เทคโนโลยีเดียวกันนี้จึงมีอยู่ในแพ็คเกจ Java ด้วยเช่นกัน หากเราสามารถวางสองคลาสที่มีชื่อเดียวกันติดกันและใช้มันได้ เราจะกำหนดได้อย่างไรว่าเราต้องการคลาสใด? ปัญหานี้แก้ไขได้ด้วยแพ็คเกจ - เราสามารถวางคลาสในแพ็คเกจที่แตกต่างกันและนำเข้าจากที่นั่น โดยระบุชื่อที่แน่นอนของแพ็คเกจที่ต้องการและเส้นทางไปยังมัน หรือเพียงแค่ระบุเส้นทางแบบเต็มไปยังคลาสที่ต้องการ![พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java ส่วนที่ 2 จาก 3 - 1](https://cdn.javarush.com/images/article/20ee6624-9d43-4f7c-8f4e-faed722986de/original.jpeg)
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 แต่คุณต้องอ่านอย่างช้าๆ และรอบคอบ โดยเจาะลึกเนื้อหา
GO TO FULL VERSION