ฉัน googled คำถามนี้ แต่ฉันไม่เข้าใจอย่างชัดเจน XML schema และ DTD คืออะไร (นิยามประเภทเอกสาร) และทำไม XML schema มีประสิทธิภาพมากกว่าเมื่อเทียบกับ DTD
คำแนะนำใด ๆ ที่จะได้รับการชื่นชมอย่างมาก
ฉัน googled คำถามนี้ แต่ฉันไม่เข้าใจอย่างชัดเจน XML schema และ DTD คืออะไร (นิยามประเภทเอกสาร) และทำไม XML schema มีประสิทธิภาพมากกว่าเมื่อเทียบกับ DTD
คำแนะนำใด ๆ ที่จะได้รับการชื่นชมอย่างมาก
คำตอบ:
จากส่วนต่างระหว่าง 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">
[ ... ]
ความแตกต่างระหว่างข้อกำหนด XML Schema (XSD) และนิยามประเภทเอกสาร (DTD) รวมถึง:
อัปเดต : 2015.08.26
ไม่ใช่สัญลักษณ์แสดงหัวข้อทั้งหมดเหล่านี้มีความถูกต้อง 100% แต่คุณได้รับส่วนสำคัญ
ในทางกลับกัน:
ดังที่หลาย ๆ คนได้กล่าวถึงก่อนหน้านี้ 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>
DTD มาก่อน XML และไม่ใช่ XML ที่ถูกต้อง นั่นอาจเป็นเหตุผลที่ดีที่สุดสำหรับการประดิษฐ์ของ XSD
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
ยิ่งไปกว่านั้น XSD ยังมีรายละเอียดเล็ก ๆ น้อย ๆ ว่ามันคือส่วนเสริมของ XML ทำให้สะดวกในการเรียนรู้อย่างรวดเร็ว
1
, 0 or 1
, 0 or more
ในขณะที่ XSD สามารถระบุขั้นต่ำและจำนวนสูงสุด
สิ่งหนึ่งที่แตกต่างคือใน DTD โมเดลเนื้อหาขององค์ประกอบจะถูกกำหนดโดยชื่ออย่างสมบูรณ์โดยไม่ขึ้นกับที่ปรากฏในเอกสาร:
สมมติว่าคุณต้องการ
person
องค์ประกอบname
name
ตัวเองมีองค์ประกอบของเด็กและfirst
last
แบบนี้
<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
)
ความคล้ายคลึงกัน :
ทั้ง DTD และ Schemas ทำหน้าที่พื้นฐานเหมือนกัน:
แตกต่าง:
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>
DTD สามารถมีข้อมูลได้เพียงสองประเภทคือ CDATA และ PCDATA แต่ในสคีมาคุณสามารถใช้ชนิดข้อมูลดั้งเดิมทั้งหมดที่คุณใช้ในภาษาการเขียนโปรแกรมและคุณมีความยืดหยุ่นในการกำหนดประเภทข้อมูลที่คุณกำหนดเอง
นักพัฒนาที่สร้างสคีมาสามารถสร้างชนิดข้อมูลที่กำหนดเองตามชนิดข้อมูลหลักและโดยใช้ตัวดำเนินการและตัวดัดแปลงอื่น
เมื่อ XML ออกมาเป็นครั้งแรกเราได้รับแจ้งว่าจะแก้ปัญหาทั้งหมดของเรา: XML จะใช้งานง่ายขยายได้อย่างไม่ จำกัด หลีกเลี่ยงการพิมพ์ที่รัดกุมและไม่ต้องใช้ทักษะการเขียนโปรแกรมใด ๆ ฉันเรียนรู้เกี่ยวกับ DTD และเขียนโปรแกรมแยกวิเคราะห์ XML ของฉันเอง 15 ปีขึ้นไปฉันเห็นว่า XML ส่วนใหญ่ไม่ใช้งานง่ายและไม่สามารถขยายได้มาก (ขึ้นอยู่กับการใช้งาน) ทันทีที่มีคนอุดตันที่ฉลาดบางคนติด XML เข้ากับฐานข้อมูลฉันก็รู้ว่าประเภทข้อมูลล้วน แต่หลีกเลี่ยงไม่ได้ และคุณจะเห็น XSLT (ไฟล์การแปลงสภาพ) ที่ฉันต้องทำงานในวันก่อน ถ้านั่นไม่ใช่การเขียนโปรแกรมฉันไม่รู้ว่ามันคืออะไร! ทุกวันนี้มันไม่ใช่เรื่องแปลกที่จะเห็นปัญหาทุกอย่างที่เกี่ยวข้องกับข้อมูล XML หรืออินเทอร์เฟซเสียไป ฉันรัก XML แต่มันหลงทางไกลจากจุดเริ่มต้นที่เห็นแก่ประโยชน์ดั้งเดิม
คำตอบสั้น ๆ ? DTD ได้ถูกคัดค้าน XSD เนื่องจาก XSD ช่วยให้คุณกำหนดโครงสร้าง XML ด้วยความแม่นยำมากขึ้น
วัตถุประสงค์ของDTDคือการกำหนดโครงสร้างของเอกสาร XML กำหนดโครงสร้างด้วยรายการองค์ประกอบทางกฎหมาย:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
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>
DTD เลิกใช้แล้วเนื่องจากมีข้อ จำกัด ด้านประโยชน์ในฐานะภาษาสคีมาไม่สนับสนุนเนมสเปซและไม่สนับสนุนประเภทข้อมูล นอกจากนี้ไวยากรณ์ของ DTD ค่อนข้างซับซ้อนทำให้ยากที่จะเข้าใจและดูแล ..
DTD บ่งชี้ไวยากรณ์ขององค์ประกอบ XML
XML Schemas เป็นทางเลือกของ Microsoft สำหรับ DTD สำหรับการตรวจสอบ XML