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


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

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

12 139

12 ответов:

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

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

цель DTDs состояла в том, чтобы сохранить уровень совместимости с SGML для приложения, которые могут захотеть преобразовать СОЯР определения DTD в XML определения DTD. Однако, в соответствии с одним из цели 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 обеспечивает безопасную передачу данных т. е. отправитель может описать данные таким образом, что получатель поймет, но в случае 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 были указаны позже. Вы можете использовать DTD в сочетании с пространствами имен, но это требует некоторых искажений, таких как принудительное определение префиксов в DTD и использование только этих префиксов, вместо того, чтобы использовать произвольные префиксы.

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

сходство:

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

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

отличия:

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

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

примеры:

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