Відповіді:
З розділу " Відмінності між 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">
[...]
Відмінності між визначенням схеми 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 з якихось причин, я зазвичай пишу RELAX NG і конвертувати його 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-схеми є альтернативою Microsoft для DTD для перевірки XML