В чем разница между XML-схемой и DTD?


175

Я гуглил этот вопрос, но я не понимаю, что такое XML-схема и DTD (определение типа документа) и почему XML-схема является более мощной по сравнению с DTD.

Любое руководство будет высоко ценится.

Ответы:


136

Из раздела « Различия между DTD и схемой» статьи « Преобразование DTD в схему» :

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

Целью DTD было сохранение уровня совместимости с SGML для приложений, которые могут захотеть преобразовать DTD SGML в XML DTD. Тем не менее, в соответствии с одной из целей XML, «краткость разметки XML имеет минимальное значение», нет реальной проблемы с кратким изложением синтаксиса.

[...]

Итак, каковы некоторые другие различия, которые могут быть особенно важны, когда мы конвертируем DTD? Давайте взглянем.

Typing

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

[...]

Ограничения вхождения

Другая область, где DTD и Схема значительно различаются, связана с ограничениями вхождения. Если вы вспомните из наших предыдущих примеров в главе 2 «Структура схемы» (или свою собственную работу с DTD), есть три символа, которые вы можете использовать для ограничения числа вхождений элемента: *, + и?.

[...]

Перечисления

Итак, допустим, у нас был элемент, и мы хотели иметь возможность определить атрибут размера для рубашки, который позволял пользователям выбирать размер: маленький, средний или большой. Наш DTD будет выглядеть так:

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

[...]

Но что, если мы хотим sizeбыть элементом? Мы не можем сделать это с DTD. DTD не обеспечивают перечисления в текстовом содержимом элемента. Однако из-за типов данных в Schema, когда мы объявили перечисление в предыдущем примере, мы фактически создали 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
Мордехай

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, я обычно пишу расслабьтесь и преобразуйте его trang.)


6

Сходства :

DTD и схемы выполняют одинаковые основные функции:

  • Во-первых, они оба объявляют список элементов и атрибутов.
  • Во-вторых, оба описывают, как эти элементы группируются, вкладываются или используются в XML. Другими словами, они объявляют правила, по которым вы позволяете кому-то создавать XML-файл в вашем рабочем процессе, и
  • В-третьих, и DTD, и схемы предоставляют методы для ограничения или форсирования типа или формата элемента. Например, в DTD или Схеме вы можете заставить поле даты записываться как 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-схемы являются альтернативой DTD от Microsoft для проверки XML

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.