XML Schema กับ DTD แตกต่างกันอย่างไร


175

ฉัน googled คำถามนี้ แต่ฉันไม่เข้าใจอย่างชัดเจน XML schema และ DTD คืออะไร (นิยามประเภทเอกสาร) และทำไม XML schema มีประสิทธิภาพมากกว่าเมื่อเทียบกับ DTD

คำแนะนำใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

คำตอบ:


136

จากส่วนต่างระหว่าง DTD และ Schemaของการแปลง DTD เป็นบทความSchema :

ความแตกต่างที่สำคัญระหว่าง DTDs และ XML Schema คือ XML Schema ใช้ไวยากรณ์ที่อิงกับ XML ในขณะที่ DTD มีไวยากรณ์ที่ไม่ซ้ำกันซึ่งจัดขึ้นจาก SGML DTDs ถึงแม้ว่า DTD นั้นจะถูกวิพากษ์วิจารณ์บ่อยครั้งเนื่องจากความต้องการเรียนรู้ไวยากรณ์ใหม่ แต่ไวยากรณ์เองนั้นค่อนข้างสั้น ตรงกันข้ามเป็นจริงสำหรับ XML Schema ซึ่งเป็น verbose แต่ยังใช้ประโยชน์จากแท็กและ XML เพื่อให้ผู้เขียนของ XML ควรหาไวยากรณ์ของ XML Schema ที่น่ากลัวน้อยกว่า

เป้าหมายของ DTDs คือการรักษาระดับความเข้ากันได้กับ SGML สำหรับแอปพลิเคชันที่อาจต้องการแปลง SGML DTDs เป็น XML DTDs อย่างไรก็ตามในการรักษาด้วยหนึ่งในเป้าหมายของ XML "terseness ใน XML มาร์กอัปมีความสำคัญน้อยที่สุด" ไม่มีความกังวลที่แท้จริงกับการทำให้สั้นไวยากรณ์

[ ... ]

ดังนั้นอะไรคือความแตกต่างอื่น ๆ ซึ่งอาจสำคัญเป็นพิเศษเมื่อเราแปลง DTD? ลองมาดูกัน

การพิมพ์

ความแตกต่างที่สำคัญที่สุดระหว่าง DTDs และ XML Schema คือความสามารถในการสร้างและใช้ประเภทข้อมูลใน Schema ร่วมกับการประกาศองค์ประกอบและคุณสมบัติ ในความเป็นจริงมันเป็นความแตกต่างที่สำคัญที่ครึ่งหนึ่งของการแนะนำ XML Schema นั้นใช้เพื่อจัดเก็บข้อมูลและ XML Schema เราครอบคลุมประเภทข้อมูลโดยละเอียดในส่วนที่สามของหนังสือเล่มนี้ "XML Schema Datatypes"

[ ... ]

ข้อ จำกัด ที่เกิดขึ้น

พื้นที่ที่ DTDs และ Schema แตกต่างกันอย่างมีนัยสำคัญก็คือมีข้อ จำกัด ที่เกิดขึ้น หากคุณจำได้จากตัวอย่างก่อนหน้าของเราในบทที่ 2 "โครงสร้าง Schema" (หรืองานของคุณกับ DTD) มีสามสัญลักษณ์ที่คุณสามารถใช้เพื่อ จำกัด จำนวนการเกิดขององค์ประกอบ: *, + และ?

[ ... ]

enumerations

สมมติว่าเรามีองค์ประกอบและเราต้องการที่จะสามารถกำหนดคุณสมบัติขนาดสำหรับเสื้อซึ่งอนุญาตให้ผู้ใช้เลือกขนาด: เล็กกลางหรือใหญ่ DTD ของเราจะมีลักษณะเช่นนี้:

<!ELEMENT item (shirt)>
<!ELEMENT shirt (#PCDATA)>
<!ATTLIST shirt
    size_value (small | medium | large)>

[ ... ]

แต่ถ้าเราต้องการsizeเป็นองค์ประกอบ เราไม่สามารถทำได้ด้วย DTD DTD ไม่ได้มีไว้สำหรับการแจกแจงในเนื้อหาข้อความขององค์ประกอบ อย่างไรก็ตามเนื่องจากประเภทข้อมูลที่มีสคีมาเมื่อเราประกาศการแจงนับในตัวอย่างก่อนหน้านี้เราจึงสร้างการsimpleTypeเรียกsize_valuesที่เราสามารถใช้กับองค์ประกอบได้ในขณะนี้:

<xs:element name="size" type="size_value">

[ ... ]


1
เพิ่งทราบ W3C ดูเหมือนจะคิดว่า DTD เป็นภาษาของสคีมา XML: "มีหลายภาษาสคีที่แตกต่างกันในการใช้งานอย่างกว้างขวาง แต่คนที่สำคัญคือการกำหนดประเภทเอกสาร (DTD), Relax-NG, Schematron และ W3C XSD ข้อกำหนด XML Schema) " w3.org/standards/xml/schema
Mordechai

1
@ มอร์เดชัยฉันคิดว่าพวกเขากำลังระบุ DTD เป็นภาษาสคีมาไม่ใช่สคีมา XML
kaartic

90

ความแตกต่างระหว่างข้อกำหนด XML Schema (XSD) และนิยามประเภทเอกสาร (DTD) รวมถึง:

  • สกีมา XML ถูกเขียนเป็น XML ในขณะที่ DTD มาจากไวยากรณ์ SGML
  • XML schemas กำหนดประเภทข้อมูลสำหรับองค์ประกอบและคุณสมบัติในขณะที่ DTD ไม่สนับสนุนประเภทข้อมูล
  • สกีมา XML อนุญาตการสนับสนุนเนมสเปซในขณะที่ DTD ไม่รองรับ
  • สกีมา XML กำหนดหมายเลขและคำสั่งขององค์ประกอบลูกในขณะที่ DTD ไม่มี
  • สกีมา XML สามารถจัดการได้ด้วยตัวเองด้วย XML DOM แต่ไม่สามารถทำได้ในกรณีของ DTD
  • การใช้ XML schema ผู้ใช้ไม่จำเป็นต้องเรียนรู้ภาษาใหม่ แต่การทำงานกับ DTD นั้นยากสำหรับผู้ใช้
  • XML schema ให้การสื่อสารข้อมูลที่ปลอดภัยเช่นผู้ส่งสามารถอธิบายข้อมูลในแบบที่ผู้รับจะเข้าใจ แต่ในกรณีของข้อมูล DTD สามารถเข้าใจผิดโดยผู้รับ
  • สกีมา XML สามารถขยายได้ในขณะที่ DTD ไม่สามารถขยายได้

อัปเดต : 2015.08.26

ไม่ใช่สัญลักษณ์แสดงหัวข้อทั้งหมดเหล่านี้มีความถูกต้อง 100% แต่คุณได้รับส่วนสำคัญ

ในทางกลับกัน:

  • DTD ช่วยให้คุณกำหนดค่าENTITYใหม่สำหรับใช้ในไฟล์ XML ของคุณ
  • DTD ช่วยให้คุณสามารถขยายไปยังไฟล์ XML แต่ละไฟล์ได้

21

ดังที่หลาย ๆ คนได้กล่าวถึงก่อนหน้านี้ XML Schema ใช้ไวยากรณ์ XML และ DTD มีไวยากรณ์ที่ไม่ซ้ำกัน DTD ไม่รองรับประเภทข้อมูลซึ่งมีความสำคัญ

ให้ดูตัวอย่างง่ายๆที่มหาวิทยาลัยมีนักเรียนหลายคนและนักเรียนแต่ละคนมีสององค์ประกอบ "ชื่อ" และ "ปี" โปรดทราบว่าฉันใช้ "// ->" ในรหัสของฉันเพื่อแสดงความคิดเห็น

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันจะเขียนตัวอย่างนี้ทั้งใน DTD และใน XSD

DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE university[              // --> university as root element 
<!ELEMENT university (student*)>   // --> university has  * = Multiple students
<!ELEMENT student (name,year)>     // --> Student has elements name and year
<!ELEMENT name (#PCDATA)>          // --> name as Parsed character data
<!ELEMENT year (#PCDATA)>          // --> year as Parsed character data
]>

<university>
    <student>
        <name>
            John Niel             //---> I can also use an Integer,not good
        </name>
        <year>
            2000                 //---> I can also use a string,not good
        </year>
    </student>
</university>

ข้อกำหนด XML Schema (XSD)

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

<xsd:complexType name ="uniType">                    //--> complex datatype uniType
 <xsd:sequence>
  <xsd:element ref="student" maxOccurs="unbounded"/> //--> has unbounded no.of students
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="stuType">                     //--> complex datatype stuType
 <xsd:sequence>
  <xsd:element ref="name"/>                          //--> has element name
  <xsd:element ref="year"/>                          //--> has element year
 </xsd:sequence>
</xsd:complexType>

<xsd:element name="university" type="uniType"/>       //--> university of type UniType 
<xsd:element name="student" type="stuType"/>          //--> student of type stuType
<xsd:element name="name" type="xsd:string"/>          //--> name of datatype string
<xsd:element name="year" type="xsd:integer"/>         //--> year of datatype integer
</xsd:schema>



<?xml version="1.0" encoding="UTF-8"?>
<university>
    <student>
        <name>
            John Niel          
        </name>
        <year>
            2000                      //--> only an Integer value is allowed
        </year>
    </student>
</university>

16

DTD มาก่อน XML และไม่ใช่ XML ที่ถูกต้อง นั่นอาจเป็นเหตุผลที่ดีที่สุดสำหรับการประดิษฐ์ของ XSD


อย่างแน่นอน - XSD / XML Schema เป็น XML ตัวเอง - ซึ่งเป็นสิ่งที่ดีจริงๆ!
marc_s

hmm, XSD เพิ่มสิ่งมากกว่าแค่ไวยากรณ์ XML; เช่นประเภทข้อมูล
รูเบนส์ Farias

9

ความคล้ายคลึงกันระหว่าง XSD และ DTD

both specify elements, attributes, nesting, ordering, #occurences

ความแตกต่างระหว่าง XSD และ DTD

XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD 

ยิ่งไปกว่านั้น XSD ยังมีรายละเอียดเล็ก ๆ น้อย ๆ ว่ามันคือส่วนเสริมของ XML ทำให้สะดวกในการเรียนรู้อย่างรวดเร็ว


2
DTD ถูก จำกัด มากกว่า XSD เท่าที่#occurencesมีเพียงทางเลือกของ1, 0 or 1, 0 or moreในขณะที่ XSD สามารถระบุขั้นต่ำและจำนวนสูงสุด
Jesse Chisholm

8

สิ่งหนึ่งที่แตกต่างคือใน DTD โมเดลเนื้อหาขององค์ประกอบจะถูกกำหนดโดยชื่ออย่างสมบูรณ์โดยไม่ขึ้นกับที่ปรากฏในเอกสาร:

สมมติว่าคุณต้องการ

  • personองค์ประกอบ
  • ด้วยองค์ประกอบของเด็กที่เรียกว่า name
  • nameตัวเองมีองค์ประกอบของเด็กและfirstlast

แบบนี้

   <person>
       <name>
            <first></first>
            <last></last>
       </name>
   </person>

หากcityองค์ประกอบในเอกสารเดียวกันต้องมีองค์ประกอบลูก 'ชื่อ' DTD กำหนดให้องค์ประกอบ 'ชื่อ' นี้ต้องมีองค์ประกอบลูกfirstและlastเช่นกัน แม้จะมีข้อเท็จจริงที่city.nameไม่ต้องการfirstและlastเป็นเด็ก

ในทางตรงกันข้าม XML Schema อนุญาตให้คุณประกาศประเภทองค์ประกอบลูกในเครื่อง คุณสามารถประกาศnameองค์ประกอบย่อยสำหรับทั้งสองอย่างpersonและcityแยกกัน ดังนั้นให้พวกเขามีโมเดลเนื้อหาที่เหมาะสมในบริบทเหล่านั้น

ข้อแตกต่างที่สำคัญอื่น ๆ คือการรองรับเนมสเปซ เนื่องจาก DTDs เป็นส่วนหนึ่งของข้อกำหนด XML ดั้งเดิม (และสืบทอดมาจาก SGML) จึงไม่ได้ตระหนักถึงเนมสเปซเลยเนื่องจากมีการระบุเนมสเปซ XML ในภายหลัง คุณสามารถใช้ DTD ร่วมกับเนมสเปซได้ แต่ต้องมีการโต้แย้งเช่นถูกบังคับให้กำหนดคำนำหน้าใน DTD และใช้เฉพาะคำนำหน้าเหล่านั้นแทนการใช้คำนำหน้าโดยพลการ

สำหรับฉันความแตกต่างอื่น ๆ ส่วนใหญ่เป็นผิวเผิน การสนับสนุนประเภทข้อมูลสามารถเพิ่มไปยัง DTD ได้อย่างง่ายดายและไวยากรณ์เป็นเพียงไวยากรณ์ (ฉันคนหนึ่งค้นหาไวยากรณ์ XML Schema ที่น่ากลัวและไม่ต้องการบำรุง XML Schema ด้วยมือซึ่งฉันจะไม่พูดเกี่ยวกับ DTDs หรือ RELAX NG schemas หากฉันต้องการ XML Schema ด้วยเหตุผลบางอย่างฉันมักจะเขียน RELAX NG one และแปลงด้วยtrang)


6

ความคล้ายคลึงกัน :

ทั้ง DTD และ Schemas ทำหน้าที่พื้นฐานเหมือนกัน:

  • ก่อนอื่นพวกเขาทั้งคู่จะประกาศรายการองค์ประกอบและคุณลักษณะการซัก
  • ประการที่สองทั้งสองอธิบายถึงวิธีการจัดกลุ่มองค์ประกอบซ้อนกันหรือใช้ภายใน XML กล่าวอีกนัยหนึ่งพวกเขาประกาศกฎที่คุณอนุญาตให้บางคนสร้างไฟล์ XML ภายในเวิร์กโฟลว์ของคุณและ
  • ประการที่สามทั้ง DTD และ schemas จัดเตรียมวิธีในการ จำกัด หรือบังคับประเภทหรือรูปแบบขององค์ประกอบ ตัวอย่างเช่นภายใน DTD หรือ Schema คุณสามารถบังคับให้ฟิลด์วันที่เขียนเป็น 01/05/06 หรือ 1/5/2549

แตกต่าง:

  • DTD ดีกว่าสำหรับแอปพลิเคชันที่ใช้ข้อความเป็นหลักในขณะที่ schema มีข้อดีหลายประการสำหรับเวิร์กโฟลว์ที่ใช้ข้อมูลมาก

  • Schemas เขียนด้วย XML และปฏิบัติตามกฎเดียวกันในขณะที่ DTD เขียนด้วยภาษาที่แตกต่างอย่างสิ้นเชิง

ตัวอย่าง:

DTD:

<?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT employees (Efirstname, Elastname, Etitle, Ephone, Eemail)>
         <!ELEMENT Efirstname (#PCDATA)>
         <!ELEMENT Elastname (#PCDATA)>
         <!ELEMENT Etitle (#PCDATA)>
         <!ELEMENT Ephone (#PCDATA)>
         <!ELEMENT Eemail (#PCDATA)>

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="employees" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:attribute name="generated" type="xsd:dateTime"/>
      </xsd:complexType>
</xsd:element>
<xsd:element name="employees">
      <xsd:annotation>
           <xsd:appinfo>
               <od:index index-name="PrimaryKey" index-key="Employeeid " primary="yes"
                unique="yes" clustered="no"/>
          <od:index index-name="Employeeid" index-key="Employeeid " primary="no" unique="no"
           clustered="no"/>
     </xsd:appinfo>
</xsd:annotation>
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element name="Elastname" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Etitle" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Ephone" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Eemail" minOccurs="0" od:jetType="text"
               od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Ephoto" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
          </xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

4

DTD สามารถมีข้อมูลได้เพียงสองประเภทคือ CDATA และ PCDATA แต่ในสคีมาคุณสามารถใช้ชนิดข้อมูลดั้งเดิมทั้งหมดที่คุณใช้ในภาษาการเขียนโปรแกรมและคุณมีความยืดหยุ่นในการกำหนดประเภทข้อมูลที่คุณกำหนดเอง

นักพัฒนาที่สร้างสคีมาสามารถสร้างชนิดข้อมูลที่กำหนดเองตามชนิดข้อมูลหลักและโดยใช้ตัวดำเนินการและตัวดัดแปลงอื่น


DTD ยังสามารถมีส่วนย่อยของ CDATA ที่เรียกว่าการนับค่า
Jesse Chisholm

4

เมื่อ XML ออกมาเป็นครั้งแรกเราได้รับแจ้งว่าจะแก้ปัญหาทั้งหมดของเรา: XML จะใช้งานง่ายขยายได้อย่างไม่ จำกัด หลีกเลี่ยงการพิมพ์ที่รัดกุมและไม่ต้องใช้ทักษะการเขียนโปรแกรมใด ๆ ฉันเรียนรู้เกี่ยวกับ DTD และเขียนโปรแกรมแยกวิเคราะห์ XML ของฉันเอง 15 ปีขึ้นไปฉันเห็นว่า XML ส่วนใหญ่ไม่ใช้งานง่ายและไม่สามารถขยายได้มาก (ขึ้นอยู่กับการใช้งาน) ทันทีที่มีคนอุดตันที่ฉลาดบางคนติด XML เข้ากับฐานข้อมูลฉันก็รู้ว่าประเภทข้อมูลล้วน แต่หลีกเลี่ยงไม่ได้ และคุณจะเห็น XSLT (ไฟล์การแปลงสภาพ) ที่ฉันต้องทำงานในวันก่อน ถ้านั่นไม่ใช่การเขียนโปรแกรมฉันไม่รู้ว่ามันคืออะไร! ทุกวันนี้มันไม่ใช่เรื่องแปลกที่จะเห็นปัญหาทุกอย่างที่เกี่ยวข้องกับข้อมูล XML หรืออินเทอร์เฟซเสียไป ฉันรัก XML แต่มันหลงทางไกลจากจุดเริ่มต้นที่เห็นแก่ประโยชน์ดั้งเดิม

คำตอบสั้น ๆ ? DTD ได้ถูกคัดค้าน XSD เนื่องจาก XSD ช่วยให้คุณกำหนดโครงสร้าง XML ด้วยความแม่นยำมากขึ้น


4

XML DTD

วัตถุประสงค์ของDTDคือการกำหนดโครงสร้างของเอกสาร XML กำหนดโครงสร้างด้วยรายการองค์ประกอบทางกฎหมาย:

<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>

XML Schema

XML Schemaช่วยให้ผู้เขียนสคีมาสามารถระบุข้อมูลของปริมาณองค์ประกอบที่ต้องเป็นตัวเลขหรือจำนวนเต็มยิ่งขึ้น ในตัวอย่างต่อไปนี้ฉันใช้string:

<xs:element name="note">
<xs:complexType>
  <xs:sequence>
    <xs:element name="address1" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="state" type="xs:string"/>
    <xs:element name="zip" type="xs:string"/>
  </xs:sequence>
</xs:complexType>


2

DTD เลิกใช้แล้วเนื่องจากมีข้อ จำกัด ด้านประโยชน์ในฐานะภาษาสคีมาไม่สนับสนุนเนมสเปซและไม่สนับสนุนประเภทข้อมูล นอกจากนี้ไวยากรณ์ของ DTD ค่อนข้างซับซ้อนทำให้ยากที่จะเข้าใจและดูแล ..


2
เลิก? ไม่ได้ [เลิก XDR] กำลังจะเลิกแฟชั่นแล้วใช่ไหม อาจจะ. จำกัด มากกว่า XSD ไหม? ใช่. ฟังก์ชั่นเซตย่อยของฟังก์ชั่น XSD? ไม่ไวยากรณ์ซับซ้อนเกินไปใช่ไหม แทบจะไม่แตกต่างกัน (IMHO) โดยส่วนตัวฉันพบว่า DTD อ่านง่ายกว่า XSD อย่างแม่นยำเพราะไม่ใช่ XML
Jesse Chisholm

-7

DTD บ่งชี้ไวยากรณ์ขององค์ประกอบ XML

XML Schemas เป็นทางเลือกของ Microsoft สำหรับ DTD สำหรับการตรวจสอบ XML

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.