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

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

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

12 ответов


С различия между DTDs и схемой на преобразование DTD в схему статьи:

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

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

[...]

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

введя

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

[...]

Ограничения На Возникновение

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

[...]

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

Итак, предположим, у нас был элемент, и мы хотели иметь возможность определить атрибут размера для рубашки, который позволял пользователям выбирать размер: маленький, средний или большой. Наш 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) включают:

  • XML-схемы написаны в XML, а DTD являются производными от синтаксиса SGML.
  • XML-схемы определяют типы данных для элементов и атрибутов, в то время как DTD не поддерживает типы данных.
  • XML-схемы позволяют поддерживать пространства имен, а DTD-нет.
  • XML-схемы определяют количество и порядок дочерних элементов, в то время как DTD делает не.
  • XML-схемами можно управлять самостоятельно с помощью XML DOM, но это невозможно в случае DTD.
  • использование XML-схемы пользователю не нужно изучать новый язык, но работать с DTD трудно для пользователя.
  • XML-схема обеспечивает безопасную передачу данных i.e отправитель может описать данные так, чтобы получатель понял, но в случае DTD данные могут быть неправильно поняты получателем.
  • XML-схемы являются расширяемыми, а DTD-нет раздвижной.

обновление: 2015.08.26

Не все эти точки пули на 100% точны, но вы получаете суть.

с другой стороны:

  • DTD позволяет определить новый сущности значения для использования в XML-файл.
  • DTD позволяет расширить его локально на отдельный XML-файл.

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


Как уже упоминалось ранее, XML-схема использует синтаксис на основе XML, а DTDs имеют уникальный синтаксис. 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>

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


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

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

для меня, другие различия, в основном, поверхностные. Поддержка типов данных может быть легко добавлена в DTDs, а синтаксис - это просто синтаксис. (Я, например, нахожу синтаксис схемы XML ужасным и никогда не хотел бы вручную поддерживать схему XML, что я бы не сказал о DTDs или RELAX ng schemas; если мне нужна схема XML по какой-то причине, Обычно я пишу RELAX ng one и конвертирую его с помощью trang.)


сходство:

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

  • во-первых, они оба заявляют, перечень элементов и атрибутов.
  • во-вторых, оба описывают, как эти элементы группируются, вложены или используются в XML. Другими словами, они объявляют правила, по которым вы позволяете кому-то создавать XML-файл в вашем рабочем процессе, и
  • в-третьих, и DTDs и схемы обеспечивают методы для ограничение или принуждение типа или формата элемента. Например, в DTD или схеме можно принудительно записать поле даты как 01/05/06 или 1/5/2006.

отличия:

  • DTDs лучше для текстовых приложений, в то время как схемы имеют несколько преимуществ для интенсивных рабочих процессов.

  • схемы написаны в XML и таким образом следуют тем же правилам, в то время как DTDs написаны в совершенно другой язык.

примеры:

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 DTD

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

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

XML Schema

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>


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

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


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


DTD указывает синтаксис XML-элемента

XML-схемы являются альтернативой Microsoft DTD для проверки XML