ล่าสุดการพัฒนาเว็บบทเรียน
×

XML เกี่ยวกับการสอน

XML บ้าน XML บทนำ XML วิธีใช้ XML ต้นไม้ XML วากยสัมพันธ์ XML องค์ประกอบ XML แอตทริบิวต์ XML namespaces XML แสดง XML XSLT XML XPath XML XLink XML ตรวจสอบ XML DTD XML schema XML เซิร์ฟเวอร์ XML การประยุกต์ใช้งาน XML ตัวอย่าง XML ทดสอบ XML ใบรับรอง

XML DOM

DOM แนะนำ DOM โหนด DOM XMLHttpRequest DOM การเข้าถึง DOM ข้อมูลโหนด DOM รายการโหนด DOM ภายใน DOM การนำทาง DOM ได้รับค่า DOM Change โหนด DOM Remove โหนด DOM Replace โหนด DOM Create โหนด DOM Add โหนด DOM Clone โหนด DOM ตัวอย่าง

DOM การอ้างอิง

DOM ประเภทโหนด DOM ปม DOM NodeList DOM NamedNodeMap DOM เอกสาร DOM ธาตุ DOM คุณลักษณะ DOM ข้อความ DOM CDATA DOM คิดเห็น DOM XMLHttpRequest DOM parser

XML DTD

DTD แนะนำ DTD การก่อสร้างตึก DTD องค์ประกอบ DTD แอตทริบิวต์ DTD องค์ประกอบ VS attr DTD หน่วยงาน DTD ตัวอย่าง

XSD Schema

XSD แนะนำ XSD ทำอย่างไร XSD <schema> XSD องค์ประกอบ XSD แอตทริบิวต์ XSD ข้อ จำกัด

XSD ซับซ้อน

XSD องค์ประกอบ XSD ว่างเปล่า XSD เพียงองค์ประกอบ XSD ข้อความเท่านั้น XSD ผสม XSD ตัวชี้วัด XSD <any> XSD <anyAttribute> XSD การแทน XSD ตัวอย่าง

XSD Data

XSD เชือก XSD วันที่ XSD เป็นตัวเลข XSD อื่น ๆ XSD การอ้างอิง

Web บริการ

XML บริการ XML WSDL XML SOAP XML RDF XML RSS

 

ตัวอย่าง XSD


บทนี้จะแสดงให้เห็นวิธีการเขียน XML Schema นอกจากนี้คุณยังจะได้เรียนรู้ว่าคีสามารถเขียนในรูปแบบที่แตกต่างกัน


เอกสาร XML

ลองมาดูที่เอกสาร XML นี้เรียกว่า "shiporder.xml" :

<?xml version="1.0" encoding="UTF-8"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

เอกสาร XML ข้างต้นประกอบด้วยองค์ประกอบราก "shiporder" ที่มีแอตทริบิวต์ที่จำเป็นเรียกว่า "orderid" "shiporder" องค์ประกอบที่มีสามองค์ประกอบของเด็กแตกต่างกัน: "orderperson" , "shipto" และ "item" "item" องค์ประกอบที่ปรากฏขึ้นสองครั้งและมันมี "title" , เลือก "note" องค์ประกอบเป็น "quantity" และ "price" องค์ประกอบ

บรรทัดด้านบน: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" บอก parser XML ที่เอกสารนี้ควรได้รับการตรวจสอบกับสคีมา บรรทัด: xsi: noNamespaceSchemaLocation = "shiporder.xsd" ระบุตำแหน่งที่อยู่ของสคี (here it is in the same folder as "shiporder.xml")


สร้าง XML Schema

ตอนนี้เราต้องการที่จะสร้างสคีสำหรับเอกสาร XML ดังกล่าวข้างต้น

เราเริ่มต้นด้วยการเปิดไฟล์ใหม่ที่เราจะเรียก "shiporder.xsd" เพื่อสร้างสคีมาเราก็สามารถปฏิบัติตามโครงสร้างในเอกสาร XML และกำหนดแต่ละองค์ประกอบในขณะที่เราพบว่ามัน เราจะเริ่มต้นด้วยการประกาศมาตรฐาน XML ตามด้วย XS: องค์ประกอบที่กำหนดสคีมาคีมา:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

ในสคีมาข้างต้นเราใช้ namespace มาตรฐาน (xs) และ URI ที่เกี่ยวข้องกับ namespace นี้เป็นคำนิยามภาษาแบบแผนซึ่งมีค่ามาตรฐานของ http://www.w3.org/2001/XMLSchema

ต่อไปเราจะต้องกำหนด "shiporder" องค์ประกอบ องค์ประกอบนี้มีแอตทริบิวต์และจะมีองค์ประกอบอื่น ๆ ดังนั้นเราจึงคิดว่ามันเป็นชนิดที่มีความซับซ้อน องค์ประกอบลูกของ "shiporder" องค์ประกอบที่ล้อมรอบด้วย XS: องค์ประกอบลำดับที่กำหนดลำดับการสั่งซื้อขององค์ประกอบย่อย:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

แล้วเราจะต้องกำหนด "orderperson" องค์ประกอบเป็นชนิดที่เรียบง่าย (เพราะมันไม่ได้มีคุณลักษณะหรือองค์ประกอบอื่น ๆ ) ประเภท (xs:string) จะนำหน้าด้วยคำนำหน้า namespace ที่เกี่ยวข้องกับ Schema XML ที่ระบุว่ามีการกำหนดไว้ล่วงหน้าชนิดข้อมูลสคี:

<xs:element name="orderperson" type="xs:string"/>

ต่อไปเราจะต้องกำหนดสององค์ประกอบที่มีความซับซ้อนชนิด: "shipto" และ "item" เราเริ่มต้นด้วยการกำหนด "shipto" องค์ประกอบ:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

ด้วยสกีมาเราสามารถกำหนดหมายเลขของเหตุการณ์ที่เป็นไปได้สำหรับองค์ประกอบกับ maxOccurs และแอตทริบิวต์ minOccurs maxOccurs ระบุจำนวนสูงสุดของการเกิดขึ้นสำหรับองค์ประกอบและ minOccurs ระบุจำนวนขั้นต่ำของการเกิดขึ้นสำหรับองค์ประกอบ ค่าเริ่มต้นสำหรับทั้ง maxOccurs และ minOccurs 1!

ตอนนี้เราสามารถกำหนด "item" องค์ประกอบ องค์ประกอบนี้สามารถปรากฏหลายครั้งภายใน "shiporder" องค์ประกอบ นี้จะถูกระบุโดยการตั้งค่า maxOccurs แอตทริบิวต์ของ "item" องค์ประกอบ "unbounded" ซึ่งหมายความว่าจะมีเป็นจำนวนมากที่เกิดขึ้นของ "item" องค์ประกอบที่เป็นความปรารถนาของผู้เขียน ขอให้สังเกตว่า "note" องค์ประกอบเป็นตัวเลือก เราได้ระบุไว้โดยการตั้งค่า minOccurs แอตทริบิวต์ศูนย์:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

ตอนนี้เราสามารถประกาศแอตทริบิวต์ของ "shiporder" องค์ประกอบ ตั้งแต่นี้เป็นแอตทริบิวต์ที่จำเป็นที่เราระบุการใช้ = "จำเป็น"

Note: ชี้แจงแอตทริบิวต์มักจะต้องมาครั้งสุดท้ายเมื่อ:

<xs:attribute name="orderid" type="xs:string" use="required"/>

นี่คือรายการที่สมบูรณ์ของไฟล์คีเรียกว่า "shiporder.xsd" :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

แบ่งแบบแผน

วิธีการออกแบบก่อนหน้าเป็นเรื่องง่ายมาก แต่อาจเป็นเรื่องยากที่จะอ่านและรักษาเมื่อเอกสารที่มีความซับซ้อน

วิธีการออกแบบต่อไปจะขึ้นอยู่กับการกำหนดองค์ประกอบทั้งหมดและแอตทริบิวต์แรกและจากนั้นพวกเขาหมายถึงการใช้ ref แอตทริบิวต์

นี่คือการออกแบบใหม่ของแฟ้มสคี ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

โดยใช้ชื่อประเภท

วิธีการออกแบบที่สามกำหนดชั้นเรียนหรือชนิดที่ช่วยให้เราสามารถนำมาใช้ใหม่นิยามองค์ประกอบ นี้จะกระทำโดยการตั้งชื่อ simpleTypes และ complexTypes องค์ประกอบแล้วชี้ไปที่พวกเขาผ่าน type แอตทริบิวต์ขององค์ประกอบ

นี่คือการออกแบบที่สามของแฟ้มสคี ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

องค์ประกอบที่บ่งชี้ว่าข้อ จำกัด ประเภทข้อมูลที่ได้มาจาก namespace ที่ประเภทข้อมูล W3C XML Schema ดังนั้นส่วนต่อไปนี้หมายความว่าค่าขององค์ประกอบหรือแอตทริบิวต์จะต้องเป็นค่าสตริง:

<xs:restriction base="xs:string">

องค์ประกอบข้อ จำกัด มากขึ้นมักจะใช้ในการใช้ข้อ จำกัด กับองค์ประกอบ ดูบรรทัดต่อไปนี้จากคีมาข้างต้น

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

นี้บ่งชี้ว่าค่าขององค์ประกอบหรือแอตทริบิวต์ต้องเป็นสตริงก็ต้องตรงหกตัวอักษรในแถวและตัวอักษรเหล่านั้นต้องเป็นตัวเลข 0-9