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

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

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

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

4b9b3361

Ответ 1

В разделе Различия между 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">

[...]

Ответ 2

Различия между определением схемы 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 позволяет вам определять новые значения ENTITY для использования в вашем XML файле.
  • DTD позволяет вам распространять его локально в отдельный файл XML.

Ответ 3

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

Ответ 4

Одно из отличий заключается также в том, что в 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.)

Ответ 5

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

Ответ 6

DTD может иметь только два типа данных: CDATA и PCDATA. Но в схеме вы можете использовать все примитивные типы данных, которые вы используете на языке программирования, и у вас есть гибкость в определении ваших собственных типов данных.

Разработчик, создающий схему, может создавать пользовательские типы данных на основе основных типов данных и с помощью разных операторов и модификаторов.

Ответ 7

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>

Ответ 8

Сходства

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

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

Различия:

  • 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>

Ответ 9

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

Ответ 10

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

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

Ответ 11

Как уже упоминалось ранее, 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>

Ответ 12

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

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