जवाबों:
DTD और स्कीमा के एक स्कीम में DTD परिवर्तित करने के स्कीमा अनुभाग के बीच अंतर से :
डीटीडी और एक्सएमएल स्कीमा के बीच महत्वपूर्ण अंतर यह है कि एक्सएमएल स्कीमा एक्सएमएल-आधारित सिंटैक्स का उपयोग करती है, जबकि डीटीडी में एसजीएमएल डीटीडी से एक अद्वितीय सिंटैक्स होता है। हालाँकि, DTDs की अक्सर आलोचना की जाती है, क्योंकि नए सिंटैक्स को सीखने की आवश्यकता होती है, सिंटैक्स ही काफी चर्चित है। एक्सएमएल स्कीमा के लिए विपरीत सही है, जो क्रियात्मक हैं, लेकिन टैग और एक्सएमएल का उपयोग भी करते हैं ताकि एक्सएमएल के लेखकों को एक्सएमएल स्कीमा के सिंटैक्स को कम डराना चाहिए।
DTDs का लक्ष्य उन अनुप्रयोगों के लिए SGML के साथ संगतता के स्तर को बनाए रखना था जो SGML DTDs को XML DTS में बदलना चाहते हैं। हालांकि, XML के लक्ष्यों में से एक को ध्यान में रखते हुए, "सिंटैक्स संक्षिप्त रखने के साथ कोई वास्तविक चिंता नहीं है," XML मार्कअप में terseness न्यूनतम महत्व का है।
[...]
तो क्या कुछ अन्य अंतर हैं जो विशेष रूप से महत्वपूर्ण हो सकते हैं जब हम DTD परिवर्तित कर रहे हैं? चलो एक नज़र डालते हैं।
टाइपिंग
DTDs और XML स्कीमा के बीच सबसे महत्वपूर्ण अंतर तत्व और विशेषता घोषणाओं के साथ स्कीमा में डेटाटाइप बनाने और उपयोग करने की क्षमता है। वास्तव में, यह इतना महत्वपूर्ण अंतर है कि XML स्कीमा अनुशंसा का एक आधा डेटाटाइपिंग और XML स्कीमा के लिए समर्पित है। हम इस पुस्तक के भाग III में "XML स्कीमा डेटाटिप्स" के बारे में विस्तार से डेटाटाइप को कवर करते हैं।
[...]
घटना बाधाओं
एक अन्य क्षेत्र जहां DTDs और स्कीमा काफी भिन्नता है, घटना की बाधाओं के साथ है। यदि आप अध्याय 2, "स्कीमा स्ट्रक्चर" (या DTDs के साथ आपका अपना काम) में हमारे पिछले उदाहरणों से याद करते हैं, तो तीन प्रतीक हैं जिनका उपयोग आप किसी तत्व की घटनाओं की संख्या को सीमित करने के लिए कर सकते हैं: *, + और?
[...]
enumerations
तो, मान लें कि हमारे पास एक तत्व था, और हम शर्ट के लिए एक आकार विशेषता को परिभाषित करने में सक्षम होना चाहते थे, जो उपयोगकर्ताओं को एक आकार चुनने की अनुमति देता था: छोटा, मध्यम या बड़ा। हमारा DTD इस तरह दिखेगा:
<!ELEMENT item (shirt)> <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size_value (small | medium | large)>
[...]
लेकिन अगर हम
size
एक तत्व बनना चाहते हैं तो क्या होगा ? हम एक DTD के साथ ऐसा नहीं कर सकते। DTDs किसी तत्व की पाठ सामग्री में गणना के लिए प्रदान नहीं करते हैं। हालाँकि, स्कीमा के साथ डेटाटाइप्स के कारण, जब हमने पूर्ववर्ती उदाहरण में गणना की घोषणा की, तो हमने वास्तव में एकsimpleType
कॉल कियाsize_values
जिसे अब हम एक तत्व के साथ उपयोग कर सकते हैं:<xs:element name="size" type="size_value">
[...]
XML स्कीमा परिभाषा (XSD) और दस्तावेज़ प्रकार परिभाषा (DTD) के बीच अंतर में शामिल हैं:
अद्यतन : 2015.08.26
ये सभी बुलेट पॉइंट 100% सटीक नहीं हैं, लेकिन आपको जिस्ट मिलते हैं।
दूसरी ओर:
जैसा कि कई लोगों ने पहले उल्लेख किया है, XML स्कीमा एक XML- आधारित सिंटैक्स का उपयोग करते हैं और DTDs का एक अद्वितीय सिंटैक्स होता है। 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 स्कीमा परिभाषा (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 थोड़ा वर्बोज़ है इसका सिंटैक्स एक्सएमएल का विस्तार है, जिससे यह तेजी से सीखने में सुविधाजनक है।
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 स्कीमा आपको स्थानीय रूप से बाल तत्व प्रकारों की घोषणा करने की अनुमति देता है; आप name
दोनों person
और city
अलग-अलग के लिए बच्चे के तत्वों की घोषणा कर सकते हैं । इस प्रकार उन्हें उन संदर्भों में उनके उचित सामग्री मॉडल दे रहे हैं।
अन्य प्रमुख अंतर नेमस्पेस के लिए समर्थन है। चूंकि DTDs मूल XML विनिर्देशन का हिस्सा हैं (और SGML से विरासत में मिला है), वे सभी नाम-पता नहीं हैं क्योंकि XML नामस्थान बाद में निर्दिष्ट किए गए थे। आप नामस्थान के साथ संयोजन में DTDs का उपयोग कर सकते हैं, लेकिन इसके लिए कुछ विरोधाभासों की आवश्यकता होती है, जैसे DTD में उपसर्गों को परिभाषित करने और केवल उन उपसर्गों का उपयोग करने के लिए, बजाय मनमाने उपसर्गों का उपयोग करने में सक्षम होने के लिए।
मेरे लिए, अन्य मतभेद ज्यादातर सतही हैं। डेटाटाइप सपोर्ट को आसानी से डीटीडी में जोड़ा जा सकता है, और सिंटैक्स सिंटैक्स है। (मैं, एक के लिए, XML स्कीमा सिंटैक्स को भयानक पाता हूं और कभी भी XML स्कीमा को हाथ में नहीं रखना चाहूंगा, जिसे मैं DTDs या RELAX NG स्कीमा के बारे में नहीं कहूंगा; यदि मुझे किसी कारण से XML स्कीमा की आवश्यकता है, तो मैं आमतौर पर लिखता हूं एक RELAX एनजी एक और इसे के साथ परिवर्तित trang
।)
समानताएं :
DTDs और स्कीमा दोनों एक ही मूल कार्य करते हैं:
अंतर:
DTDs पाठ-गहन अनुप्रयोगों के लिए बेहतर हैं, जबकि स्कीमा के पास डेटा-गहन वर्कफ़्लो के कई फायदे हैं।
स्कीमाएँ 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। लेकिन एक स्कीमा में आप उन सभी आदिम डेटा प्रकारों का उपयोग कर सकते हैं जो आप प्रोग्रामिंग भाषा में उपयोग करते हैं और आपके पास अपने स्वयं के कस्टम डेटा प्रकारों को परिभाषित करने का लचीलापन है।
एक स्कीमा का निर्माण करने वाला डेवलपर मुख्य डेटा प्रकारों के आधार पर और विभिन्न ऑपरेटरों और संशोधक का उपयोग करके कस्टम डेटा प्रकार बना सकता है।
जब एक्सएमएल पहली बार बाहर आया, तो हमें बताया गया कि यह हमारी सभी समस्याओं को हल करेगा: एक्सएमएल उपयोगकर्ता के अनुकूल होगा, असीम रूप से एक्स्टेंसिबल होगा, मजबूत-टाइपिंग से बचें, और किसी भी प्रोग्रामिंग कौशल की आवश्यकता नहीं होगी। मैंने DTD के बारे में जाना और अपने XML पार्सर को लिखा। 15+ साल बाद, मैं देखता हूं कि अधिकांश XML उपयोगकर्ता के अनुकूल नहीं है, और बहुत एक्स्टेंसिबल (इसके उपयोग के आधार पर) नहीं है। जैसे ही कुछ चतुर clogs ने XML को एक डेटाबेस में झुका दिया, मुझे पता था कि डेटा प्रकार सभी अपरिहार्य थे। और, आपको XSLT (ट्रांसफ़ॉर्मेशन फ़ाइल) को देखना चाहिए जो मुझे दूसरे दिन काम करना था। अगर वह प्रोग्रामिंग नहीं है, तो मुझे नहीं पता कि क्या है! आजकल एक्सएमएल डेटा या इंटरफेस खराब होने से संबंधित सभी प्रकार की समस्याओं को देखना असामान्य नहीं है। मैं XML से प्यार करता हूं लेकिन, यह अपने मूल परोपकारी शुरुआती बिंदु से बहुत दूर चला गया है।
संक्षिप्त उत्तर? DTD को XSD के पक्ष में हटा दिया गया है क्योंकि एक XSD आपको अधिक सटीकता के साथ XML संरचना को परिभाषित करने देता है।
एक DTD का उद्देश्य XML दस्तावेज़ की संरचना को परिभाषित करना है। यह कानूनी तत्वों की सूची के साथ संरचना को परिभाषित करता है:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
एक्सएमएल स्कीमा स्कीमा लेखकों को यह निर्दिष्ट करने में सक्षम बनाता है कि तत्व मात्रा का डेटा संख्यात्मक होना चाहिए या इससे भी अधिक विशेष रूप से एक पूर्णांक। निम्नलिखित उदाहरण में मैंने प्रयोग किया है 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 स्कीमा XML को मान्य करने के लिए XML स्कीमा DTD का विकल्प है