У меня есть этот вопрос, но я не понимаю, что такое XML-схема и DTD (определение типа документа), и почему схема XML более эффективна по сравнению с DTD.
Любое руководство будет высоко оценено.
У меня есть этот вопрос, но я не понимаю, что такое XML-схема и DTD (определение типа документа), и почему схема XML более эффективна по сравнению с DTD.
Любое руководство будет высоко оценено.
В разделе Различия между DTD и схемой раздела Преобразование DTD в схему:
Критическое различие между DTD и XML-схема - это XML-схема используйте синтаксис на основе XML, тогда как DTD имеют уникальный синтаксис из DTD SGML. Хотя DTD из-за этой необходимости часто критикуют для изучения нового синтаксиса, синтаксиса сама по себе довольно короткая. Противоположность true для XML-схемы, которые verbose, но также использовать теги и XML, чтобы авторы XML могли найти синтаксис XML Schema less пугающим.
Цель DTD состояла в том, чтобы сохранить уровень совместимости с SGML для приложения, которые могут конвертировать SGML DTD в XML DTD. Однако, в соответствии с одним из цели XML, "краткость в разметке XML" имеет минимальное значение ", нет реальная забота о сохранении синтаксиса кратко.
[...]
Итак, каковы некоторые другие отличия, которые могут быть особенно важны при преобразовании DTD? Давайте посмотрим.
Typing
Наиболее значительным различием между DTD и XML Schema является возможность создавать и использовать типы данных в Схеме в сочетании с объявлениями элементов и атрибутов. На самом деле, такая важная разница в том, что одна половина Рекомендации XML Schema посвящена datatyping и XML Schema. Мы подробно рассмотрим типы данных в части 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">
[...]
Различия между определением схемы XML (XSD) и определением типа документа (DTD) включают в себя:
ОБНОВЛЕНИЕ: 2015.08.26
Не все эти пулевые точки на 100% точны, но вы получаете суть.
С другой стороны:
DTD предшествует XML и, следовательно, недействителен сам XML. Вероятно, это самая большая причина для изобретения XSD.
Одно из отличий заключается также в том, что в DTD модель контента элемента полностью определяется его именем независимо от того, где оно появляется в документе. Итак, скажите, что вы хотите иметь дочерний элемент name
вашего элемента person
, который сам имеет дочерние элементы first
и last
. Затем, если вы хотите иметь дочерний элемент name
для элемента city
в том же документе, для этого также должны быть дочерние элементы first
и last
. Напротив, XML Schema позволяет объявлять типы дочерних элементов локально, поэтому в этом случае вы можете объявлять дочерние элементы name
для person
и city
отдельно, предоставляя им соответствующие модели контента в этих контекстах.
Другим существенным отличием является поддержка пространств имен. Поскольку DTD являются частью исходной спецификации XML (и унаследованы от SGML), они вообще не знают пространства имен, поскольку пространства имен XML были указаны позже. Вы можете использовать DTD в сочетании с пространствами имен, но для этого требуются некоторые искажения, такие как принудительное определение префиксов в DTD и использование только этих префиксов вместо возможности использования произвольных префиксов.
Для меня другие различия в основном поверхностны. Поддержка Datatype может быть легко добавлена в DTD, а синтаксис - просто синтаксис. (Я, например, считаю синтаксис XML Schema ужасным и никогда не захочет вручную поддерживать XML-схему, о которой я бы не сказал о DTD или схемах RELAX NG, если мне по какой-то причине нужна XML-схема, я обычно пишу RELAX NG и преобразовать его с помощью trang
.)
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
Кроме того, хотя XSD немного подробен, его синтаксис является расширением XML, что делает его удобным для быстрого изучения.
DTD может иметь только два типа данных: CDATA и PCDATA. Но в схеме вы можете использовать все примитивные типы данных, которые вы используете на языке программирования, и у вас есть гибкость в определении ваших собственных типов данных.
Разработчик, создающий схему, может создавать пользовательские типы данных на основе основных типов данных и с помощью разных операторов и модификаторов.
XML DTD
Цель DTD - определить структуру XML-документа. Он определяет структуру со списком юридических элементов:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
XML-схема
XML Schema позволяет авторам схемы указывать, что данные о количестве элементов должны быть числовым или, точнее, целым числом. В следующем примере я использовал строку:
<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 лучше для приложений с интенсивным текстом, в то время как схемы имеют несколько преимуществ для интенсивных потоков данных.
Схемы написаны в 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 в значительной степени устарел, поскольку он ограничен своей полезностью в качестве языка схемы, не поддерживает пространство имен и не поддерживает тип данных. Кроме того, синтаксис DTD довольно сложный, что затрудняет понимание и поддержку.
Когда XML впервые появился, нам сказали, что он решит все наши проблемы: XML будет удобен в использовании, бесконечно расширяем, избегает сильной печати и не требует каких-либо навыков программирования. Я узнал о DTD и написал свой собственный синтаксический анализатор XML. Еще через 15 лет я вижу, что большинство XML не является удобным для пользователя и не очень расширяемым (в зависимости от его использования). Как только некоторые умные заглушки подключили XML к базе данных, я знал, что типы данных почти неизбежны. И вы должны увидеть XSLT (файл преобразования), с которым мне пришлось работать на днях. Если это не программирование, я не знаю, что это такое! В настоящее время не редкость видеть, что всевозможные проблемы, связанные с данными XML или интерфейсами, ухудшились. Мне нравится XML, но он отклонился далеко от своей первоначальной альтруистической отправной точки.
Короткий ответ? DTD устарели в пользу XSD, потому что XSD позволяет более точно определять структуру XML.
Как уже упоминалось ранее, XML Schema использует синтаксис на основе 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-схемы являются альтернативой Microsoft для DTD для проверки XML