XML स्कीमा और DTD में क्या अंतर है?


175

मैंने इस प्रश्न को हल कर दिया है, लेकिन मुझे स्पष्ट रूप से समझ नहीं आ रहा है कि XML स्कीमा और DTD (दस्तावेज़ प्रकार की परिभाषा) क्या है, और DTD की तुलना में XML स्कीमा अधिक शक्तिशाली क्यों है।

किसी भी मार्गदर्शन की बहुत सराहना की जाएगी।

जवाबों:


136

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">

[...]


1
बस एक नोट, W3C को लगता है कि DTD एक XML स्कीमा भाषा का प्रकार है: "व्यापक उपयोग में कई अलग-अलग स्कीमा भाषाएं हैं, लेकिन मुख्य हैं दस्तावेज़ प्रकार की परिभाषाएं (DTDs), रिलैक्स-एनजी, स्कैड्रन और W3C XSD ( XML स्कीमा परिभाषाएँ) "। w3.org/standards/xml/schema
मोर्देचाई

1
@Mordechai मुझे लगता है कि वे DTD को एक स्कीमा भाषा के रूप में निर्दिष्ट कर रहे हैं जो XML स्कीमा नहीं है।
kaartic

90

XML स्कीमा परिभाषा (XSD) और दस्तावेज़ प्रकार परिभाषा (DTD) के बीच अंतर में शामिल हैं:

  • XML स्कीमा XML में लिखे गए हैं जबकि DTD SGML सिंटैक्स से लिए गए हैं।
  • XML स्कीमा तत्वों और विशेषताओं के लिए डेटाटाइप्स को परिभाषित करते हैं जबकि DTD डेटाटाइप्स का समर्थन नहीं करता है।
  • XML स्कीमा नामस्थान के लिए समर्थन की अनुमति देता है जबकि DTD नहीं करता है।
  • XML स्कीमा बाल तत्वों की संख्या और क्रम को परिभाषित करते हैं, जबकि DTD नहीं करता है।
  • XML स्कीमा को अपने आप XML XML के साथ जोड़ दिया जा सकता है लेकिन DTD के मामले में यह संभव नहीं है।
  • XML स्कीमा उपयोगकर्ता का उपयोग करने के लिए एक नई भाषा सीखने की जरूरत नहीं है, लेकिन DTD के साथ काम करना एक उपयोगकर्ता के लिए मुश्किल है।
  • XML स्कीमा सुरक्षित डेटा संचार प्रदान करता है अर्थात प्रेषक डेटा का वर्णन इस तरह से कर सकता है कि रिसीवर समझ जाएगा, लेकिन DTD डेटा के मामले में रिसीवर द्वारा गलत समझा जा सकता है।
  • एक्सएमएल स्कीमा एक्सटेंसिबल हैं जबकि डीटीडी एक्सटेंसिबल नहीं है।

अद्यतन : 2015.08.26

ये सभी बुलेट पॉइंट 100% सटीक नहीं हैं, लेकिन आपको जिस्ट मिलते हैं।

दूसरी ओर:

  • DTD आपको अपनी XML फ़ाइल में उपयोग के लिए नए ENTITY मान परिभाषित करने देता है ।
  • DTD आपको एक व्यक्तिगत XML फ़ाइल में इसे स्थानीय रूप से विस्तारित करने देता है।

21

जैसा कि कई लोगों ने पहले उल्लेख किया है, 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>

16

DTD, XML से पूर्ववर्ती है और इसलिए स्वयं XML को मान्य नहीं है। शायद XSD के आविष्कार का सबसे बड़ा कारण यही है।


बिल्कुल - एक्सएसडी / एक्सएमएल स्कीमा एक्सएमएल ही है - जो वास्तव में एक अच्छी बात है!
marc_s

हम्म, एक्सएसडी सिर्फ एक्सएमएल सिंटैक्स की तुलना में अधिक बात जोड़ता है; उदाहरण के लिए, डेटाटाइप्स
रूबेंस फरियास

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 थोड़ा वर्बोज़ है इसका सिंटैक्स एक्सएमएल का विस्तार है, जिससे यह तेजी से सीखने में सुविधाजनक है।


2
DTD अधिक XSD जहाँ तक की तुलना में सीमित है #occurences केवल के विकल्पों के साथ 1, 0 or 1, 0 or more, जबकि XSD न्यूनतम और अधिकतम संख्या निर्दिष्ट कर सकते हैं।
जेसी चिशोल्म

8

एक अंतर यह है कि एक 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।)


6

समानताएं :

DTDs और स्कीमा दोनों एक ही मूल कार्य करते हैं:

  • सबसे पहले, वे दोनों तत्वों और विशेषताओं की एक कपड़े धोने की सूची घोषित करते हैं।
  • दूसरा, दोनों वर्णन करते हैं कि उन तत्वों को एक्सएमएल के भीतर समूहित, नेस्टेड या उपयोग कैसे किया जाता है। दूसरे शब्दों में, वे उन नियमों की घोषणा करते हैं जिनके द्वारा आप किसी को अपने वर्कफ़्लो के भीतर XML फ़ाइल बनाने की अनुमति दे रहे हैं, और
  • तीसरा, DTDs और स्कीमा दोनों प्रतिबंधित या एक तत्व के प्रकार या प्रारूपण के लिए तरीके प्रदान करते हैं। उदाहरण के लिए, DTD या स्कीमा के भीतर आप दिनांक फ़ील्ड को 01/05/06 या 1/5/2006 के रूप में लिखने के लिए बाध्य कर सकते हैं।

अंतर:

  • 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>

4

DTD में केवल दो प्रकार के डेटा हो सकते हैं, CDATA और PCDATA। लेकिन एक स्कीमा में आप उन सभी आदिम डेटा प्रकारों का उपयोग कर सकते हैं जो आप प्रोग्रामिंग भाषा में उपयोग करते हैं और आपके पास अपने स्वयं के कस्टम डेटा प्रकारों को परिभाषित करने का लचीलापन है।

एक स्कीमा का निर्माण करने वाला डेवलपर मुख्य डेटा प्रकारों के आधार पर और विभिन्न ऑपरेटरों और संशोधक का उपयोग करके कस्टम डेटा प्रकार बना सकता है।


डीटीडी में सीडीएटीए का सबसेट भी हो सकता है जिसे एन्यूमरेशन वैल्यूज कहा जाता है
जेसी चिशोल्म

4

जब एक्सएमएल पहली बार बाहर आया, तो हमें बताया गया कि यह हमारी सभी समस्याओं को हल करेगा: एक्सएमएल उपयोगकर्ता के अनुकूल होगा, असीम रूप से एक्स्टेंसिबल होगा, मजबूत-टाइपिंग से बचें, और किसी भी प्रोग्रामिंग कौशल की आवश्यकता नहीं होगी। मैंने DTD के बारे में जाना और अपने XML पार्सर को लिखा। 15+ साल बाद, मैं देखता हूं कि अधिकांश XML उपयोगकर्ता के अनुकूल नहीं है, और बहुत एक्स्टेंसिबल (इसके उपयोग के आधार पर) नहीं है। जैसे ही कुछ चतुर clogs ने XML को एक डेटाबेस में झुका दिया, मुझे पता था कि डेटा प्रकार सभी अपरिहार्य थे। और, आपको XSLT (ट्रांसफ़ॉर्मेशन फ़ाइल) को देखना चाहिए जो मुझे दूसरे दिन काम करना था। अगर वह प्रोग्रामिंग नहीं है, तो मुझे नहीं पता कि क्या है! आजकल एक्सएमएल डेटा या इंटरफेस खराब होने से संबंधित सभी प्रकार की समस्याओं को देखना असामान्य नहीं है। मैं 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 स्कीमा

एक्सएमएल स्कीमा स्कीमा लेखकों को यह निर्दिष्ट करने में सक्षम बनाता है कि तत्व मात्रा का डेटा संख्यात्मक होना चाहिए या इससे भी अधिक विशेष रूप से एक पूर्णांक। निम्नलिखित उदाहरण में मैंने प्रयोग किया है 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)। निजी तौर पर मुझे XD की तुलना में DTD को पढ़ना आसान लगता है क्योंकि यह XML नहीं है।
जेसी चिशोल्म

-7

DTD XML तत्व के सिंटैक्स को इंगित करता है

XML स्कीमा XML को मान्य करने के लिए XML स्कीमा DTD का विकल्प है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.