У чому різниця між XML-схемою та DTD?


175

Я переглянув це питання в Google, але не розумію, що це XML-схема і DTD (визначення типу документа), і чому схема XML є більш потужною порівняно з DTD.

Будь-які вказівки будуть дуже вдячні.

Відповіді:


136

З розділу " Відмінності між DTD та схемою " Перетворення DTD в статтю " Схема" :

Критична відмінність між DTD і XML Schema полягає в тому, що XML-схема використовує синтаксис на основі XML, тоді як DTD мають унікальний синтаксис, що зберігається від SGML DTD. Хоча DTD часто піддають критиці через те, що потрібно вивчити новий синтаксис, сам синтаксис є досить стислим. Навпаки, це стосується XML-схем, які є багатослівними, але також використовують теги та XML, щоб автори XML знаходили синтаксис XML-схеми менш заляканим.

Метою DTD було зберегти рівень сумісності з SGML для додатків, які можуть захотіти перетворити SGML DTD в XML DTD. Однак, у відповідності з однією з цілей XML, "строгість розмітки XML має мінімальне значення", немає реального занепокоєння у тому, щоб тримати синтаксис коротким.

[...]

То які ще інші відмінності можуть бути особливо важливими при перетворенні DTD? Давайте подивимось.

Введення тексту

Найбільш суттєва різниця між DTD і XML Schema - це можливість створювати та використовувати типи даних у Schema у поєднанні з деклараціями елементів та атрибутів. Насправді це така важлива відмінність, що половина Рекомендації XML-схеми присвячена схематизації даних та XML-схемі. Ми детально висвітлюємо типи даних у частині III цієї книги "Типи даних XML-схеми".

[...]

Обмеження виникнення

Інша область, де DTD та схема суттєво відрізняються, є обмеженнями виникнення. Якщо ви пам’ятаєте з наших попередніх прикладів у главі 2, «Структура схеми» (або ваша власна робота з DTD), є три символи, якими ви можете скористатись для обмеження кількості зустрічань елемента: *, + і?.

[...]

Перерахування

Отже, скажімо, у нас був елемент, і ми хотіли мати можливість визначити атрибут розміру для сорочки, який дозволив користувачам вибирати розмір: малий, середній або великий. Наш 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). " W3.org/standards/xml/schema
Mordechai

1
@Mordechai Я думаю, вони визначають DTD як мову схеми, а не XML-схему.
kaartic

90

Відмінності між визначенням схеми XML (XSD) і визначенням документа (DTD) включають:

  • XML-схеми записуються в XML, тоді як DTD є похідними від синтаксису SGML.
  • XML-схеми визначають типи даних для елементів та атрибутів, тоді як DTD не підтримує типи даних.
  • XML-схеми дозволяють підтримувати простори імен, тоді як DTD цього не робить.
  • XML-схеми визначають кількість та порядок дочірніх елементів, тоді як DTD - ні.
  • Схемами XML можна керувати самостійно за допомогою XML DOM, але це неможливо у випадку DTD.
  • користувачу XML-схеми користувачеві не потрібно вивчати нову мову, але робота з DTD є складною для користувача.
  • Схема XML забезпечує безпечну передачу даних, тобто відправник може описати дані таким чином, що приймач зрозуміє, але у випадку DTD дані можуть бути неправильно зрозуміли одержувачем.
  • XML-схеми розширюються, поки DTD не розширюється.

ОНОВЛЕННЯ : 2015.08.26

Не всі ці точки кулі є на 100% точними, але ви отримуєте суть.

З іншої сторони:

  • DTD дозволяє визначати нові значення ENTITY для використання у вашому XML-файлі.
  • DTD дозволяє розширити його локально на окремий XML-файл.

21

Як вже багато людей згадували раніше, XML-схема використовує синтаксис на основі 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 (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

хм, XSD додає більше речі, ніж просто синтаксис XML; наприклад, типи даних
Рубенс Фаріас

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 можна вказати мінімальне і максимальне число.
Джессі Чісгольм

8

Одна відмінність полягає в тому, що в DTD модель вмісту елемента повністю визначається його іменем, незалежно від того, де він відображається в документі:

Якщо припустити, що ви хочете мати це

  • personелемент
  • з дочірнім елементом, що називається name
  • nameсама має дочірні елементи firstі last.

Подобається це

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

Якщо cityелемент в тому ж документі також повинен мати «ім'я» дочірній елемент ПТД вимагає , щоб цей елемент «ім'я» повинен мати дочірні елементи firstі lastяк добре. Незважаючи на те, що city.nameне вимагає firstі lastяк дітей.

На відміну від цього, XML-схема дозволяє оголошувати дочірні типи елементів локально; ви можете оголосити nameдочірні елементи як для, так personі cityокремо. Таким чином надаючи їм належних моделей вмісту в цих контекстах.

Інша основна відмінність - підтримка просторів імен. Оскільки DTD є частиною оригінальної специфікації XML (і успадкована від SGML), вони взагалі не відомі в просторі імен, оскільки простори імен XML були визначені пізніше. Ви можете використовувати DTD у поєднанні з просторами імен, але для цього потрібні певні викривлення, як-от змушені визначати префікси в DTD та використовувати лише ті префікси, а не використовувати довільні префікси.

Для мене інші відмінності здебільшого поверхові. Підтримка типу даних легко може бути додана до DTD, а синтаксис - це просто синтаксис. (Я, наприклад, вважаю синтаксис XML-схеми жахливим і ніколи не хотів би вручну підтримувати XML-схему, чого я б не сказав про схеми DTD або RELAX NG; якщо мені потрібна схема XML з якихось причин, я зазвичай пишу RELAX NG і конвертувати його trang.)


6

Подібність :

І DTD, і схеми виконують однакові основні функції:

  • По-перше, вони обидва оголошують перелік елементів та атрибутів білизни.
  • По-друге, обидва описують, як ці елементи групуються, вкладаються або використовуються в XML. Іншими словами, вони декларують правила, за якими ви дозволяєте комусь створювати XML-файл у межах вашого робочого процесу, і
  • По-третє, і DTD, і схеми надають методи обмеження або примушування типу або формату елемента. Наприклад, всередині DTD або Schema ви можете змусити поле дати записувати як 01/05/06 чи 1/5/2006.

Відмінності:

  • DTD краще для текстових додатків, в той час як схеми мають ряд переваг для робочих процесів, що інтенсивно використовують дані.

  • Схеми написані в 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, що називається значеннями перерахування .
Джессі Чісгольм

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-схема

Схема 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? Ні. Синтаксис занадто складний? Навряд чи просто різні (ІМХО). Особисто мені здається, що DTD легше читати, ніж XSD саме тому, що це не XML.
Джессі Чісгольм

-7

DTD вказує на синтаксис елемента XML

XML-схеми є альтернативою Microsoft для DTD для перевірки XML

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.