В чем разница между XML-схемой и DTD? - PullRequest
157 голосов
/ 09 октября 2009

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

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

Ответы [ 12 ]

122 голосов
/ 09 октября 2009

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

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

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

[...]

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

Typing

Самым значительным отличием между DTD и схемой XML является возможность создавать и использовать типы данных в схеме вместе с объявлениями элементов и атрибутов. На самом деле, это настолько важное различие, что половина Рекомендации по XML-схемам посвящена типизации данных и XML-схеме. Мы подробно рассмотрим типы данных в части 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">

[...]

84 голосов
/ 16 мая 2012

Различия между определением схемы 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.
17 голосов
/ 17 августа 2017

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

Давайте рассмотрим очень простой пример, в котором в университете обучается несколько студентов, и у каждого студента есть два элемента: «имя» и «год».Обратите внимание, что я использую «// ->» в своем коде только для комментариев.

enter image description here

Теперь я напишу оба примера в 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 голосов
/ 09 октября 2009

DTD предшествует XML и поэтому не является действительным самим XML. Это, вероятно, самая главная причина изобретения XSD.

8 голосов
/ 13 ноября 2013

Сходство между 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, что делает его удобным для быстрого обучения.

7 голосов
/ 10 октября 2009

Одно отличие состоит также в том, что в DTD модель содержимого элемента полностью определяется его именем, независимо от того, где он появляется в документе. Итак, скажем, вы хотите иметь дочерний элемент name вашего элемента person, который сам имеет дочерние элементы first и last. Затем, если вы хотите иметь дочерний элемент name для элемента city в том же документе, то также необходимо иметь дочерние элементы first и last. Напротив, XML-схема позволяет вам объявлять типы дочерних элементов локально, поэтому в этом случае вы можете объявить дочерние элементы name для person и city отдельно, предоставив им соответствующие модели содержимого в этих контекстах.

Другим важным отличием является поддержка пространств имен. Поскольку DTD являются частью исходной спецификации XML (и унаследованы от SGML), они вообще не учитывают пространство имен, поскольку пространства имен XML были определены позже. Вы можете использовать DTD в сочетании с пространствами имен, но для этого требуются некоторые искажения, такие как принудительное определение префиксов в DTD и использование только этих префиксов вместо возможности использовать произвольные префиксы.

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

6 голосов
/ 10 октября 2015

Сходство

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 голосов
/ 08 сентября 2015

Когда впервые появился XML, нам сказали, что он решит все наши проблемы: XML будет удобным для пользователя, бесконечно расширяемым, избегает строгой типизации и не потребует никаких навыков программирования. Я узнал о DTD и написал свой собственный анализатор XML. Спустя 15 с лишним лет я вижу, что большая часть XML не удобна для пользователя и не очень расширяема (в зависимости от его использования). Как только некоторые умные засорения подключили XML к базе данных, я понял, что типы данных практически неизбежны. И вы должны увидеть XSLT (файл преобразования), с которым мне пришлось работать на днях. Если это не программирование, я не знаю, что это такое! В настоящее время нет ничего необычного в том, что все виды проблем, связанных с XML-данными или интерфейсами, испортились. Я люблю XML, но он далек от своей первоначальной альтруистической отправной точки.

Краткий ответ? DTD устарели в пользу XSD, потому что XSD позволяет вам определять структуру XML с большей точностью.

4 голосов
/ 11 ноября 2013

XML DTD

Целью DTD является определение структуры документа XML. Определяет структуру со списком юридических элементов:

<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>

XML-схема

XML-схема позволяет авторам схемы указывать, что данные о количестве элементов должны быть числовым или, более конкретно, целым числом. В следующем примере я использовал строку:

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

4 голосов
/ 12 апреля 2012

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

Разработчик, создающий схему, может создавать собственные типы данных на основе основных типов данных и с использованием различных операторов и модификаторов.

...