Ответы:
Из раздела « Различия между 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">
[...]
Различия между определением схемы XML (XSD) и определением типа документа (DTD) включают:
ОБНОВЛЕНИЕ : 2015.08.26
Не все эти пункты являются на 100% точными, но вы понимаете суть.
С другой стороны:
Как уже упоминалось многими людьми, 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>
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 немного многословен, его синтаксис является расширением XML, что делает его удобным для быстрого обучения.
1
, 0 or 1
, 0 or more
, в то время как XSD можно указать минимальное и максимальное число.
Одно из отличий состоит в том, что в 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
.)
Сходства :
DTD и схемы выполняют одинаковые основные функции:
Отличия:
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>
DTD может иметь только два типа данных, CDATA и PCDATA. Но в схеме вы можете использовать все примитивные типы данных, которые вы используете в языке программирования, и вы можете гибко определять свои собственные типы данных.
Разработчик, создающий схему, может создавать собственные типы данных на основе основных типов данных и с использованием различных операторов и модификаторов.
Когда впервые появился XML, нам сказали, что он решит все наши проблемы: XML будет удобным для пользователя, бесконечно расширяемым, избегает строгой типизации и не потребует никаких навыков программирования. Я узнал о DTD и написал свой собственный анализатор XML. Спустя 15 с лишним лет я вижу, что большая часть XML не удобна для пользователя и не очень расширяема (в зависимости от его использования). Как только некоторые умные засорения подключили XML к базе данных, я понял, что типы данных практически неизбежны. И вы должны увидеть XSLT (файл преобразования), с которым мне пришлось работать на днях. Если это не программирование, я не знаю, что это такое! В настоящее время нет ничего необычного в том, что все виды проблем, связанных с XML-данными или интерфейсами, испортились. Я люблю XML, но он далек от своей первоначальной альтруистической отправной точки.
Краткий ответ? DTD устарели в пользу XSD, потому что XSD позволяет вам определять структуру XML с большей точностью.
Целью 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>
DTD в значительной степени устарел, потому что он ограничен в своей полезности в качестве языка схемы, не поддерживает пространство имен и не поддерживает тип данных. Кроме того, синтаксис DTD довольно сложен, что затрудняет его понимание и поддержку.
DTD указывает синтаксис элемента XML
XML-схемы являются альтернативой DTD от Microsoft для проверки XML