Как выбрать между DTD и XSD - PullRequest
49 голосов
/ 05 марта 2010

Я хочу использовать DTD или XSD для описания моего XML-документа. Я читал, что XSD лучше, чем DTD, поскольку они поддерживают пространства имен и типы данных, и что DTD старше.

Значит ли это, что я должен использовать XSD только для всех будущих нужд и полностью игнорировать DTD в качестве опции? Стоит ли вообще изучать структуру DTD?

Какие факторы следует учитывать при выборе между XSD и DTD?

Ответы [ 7 ]

45 голосов
/ 05 марта 2010

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

Однако, для ваших текущих целей описания XML-документа, действительно придерживайтесь XSD.

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

8 голосов
/ 05 марта 2010

Это действительно зависит от того, насколько сложна структура, которую нужно настроить.

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

Насколько я понимаю, XSD является производным от DTD, поэтому понимание DTD даст прочную основу для изучения XSD, а также укажет на некоторые недостатки DTD.

6 голосов
/ 05 марта 2010

Не мешало бы понять структуру DTD (это поможет вам лучше понять XSD в долгосрочной перспективе) ... но вы должны использовать XSD для продвижения вперед.

5 голосов
/ 08 марта 2010

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

С помощью XSD вы можете не только проверить структуру / иерархию тегов XML, но и

  1. Вы можете определить тип данных значения узлов. [дата, число, строка и т. д.]
  2. Вы также можете определить пользовательские data_types, [пример, для узла , возможные данные могут быть один из 12 месяцев .. так что вам нужно определить все 12 месяцев в новом Тип данных записи все 12 месяцев имена как значения перечисления .. проверка показывает ошибку, если ввод XML содержит любое другое значение, кроме эти 12 значений ..]
  3. Вы можете наложить ограничение на появление элементов, используя minOccurs и maxOccurs, по умолчанию значения 1 и 1.

.. и многие другие ...

Есть некоторые ограничения: как, например,

  1. Элемент (имя), определенный в файле XSD должен быть определен только с одним типом данных.
  2. Вы не можете проверить узел / атрибут используя значение другого узел / атрибут.
3 голосов
/ 20 марта 2014

ИМХО очень важна проблема использования DTD (возможно, вместе с XSD, если вам требуется углубленная проверка):

В DTD вы можете определить свои собственные сущности, например:

<!ENTITY MyName "DrDr.Hannibal Xerxes Utah,MBA and CEO">

В своем документе вы можете везде, где это необходимо, просто ввести код & MyName;вместо этого наберите весь этот материал.

Кроме того, предположим, что у вас есть XML-подобный файл (возможно, созданный каким-либо другим приложением), который состоит из множества похожих тегов, но без корневого тега, например:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<Book Author="Author1">
  <Titel>Erstes Buch</Titel>
</Book>
...
<Book Author="Author5">
  <Titel>Fünftes Buch</Titel>
</Book>

Предположим, этот файл называется "Booklist.TXT",

Теперь вы можете кодировать свой master-xml:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<DOCTYPE MyRoot [
<ENTITY AllBooks SYSTEM "Booklist.TXT">
]

<MyRoot>
... some prefix-stuff as needed ...
&AllBooks; <!-- here are all the Books -->
... some post stuff es needed ...
</MyBook>

, и когда вам нужны книги в другом контексте, вы толькодолжен кодировать окружающий xml и не касаться и не копировать сам список книг, кроме того, вы можете поддерживать его в одном месте и вносить все изменения в любой документ.

2 голосов
/ 16 февраля 2013

Это старая строка, НО на случай, если кто-нибудь еще столкнется с ней ... из того, что я могу сказать, у DTD есть два преимущества, которых нет у XSD, а именно включение функции ENTITY, которой нет в XSD. Это довольно удивительная функция, которая сообщает компилятору, как обрабатывать потенциально незнакомые типы файлов, определяя, какие программы открывать для их обработки.

Кроме того, DTD записываются в спецификации XML, поэтому их можно записывать непосредственно в документы XML, тогда как XSD должен существовать как внешний файл и быть подключенным. Ничего страшного, особенно при использовании в больших документах.

Я думаю, что XSD все еще намного лучше и естественнее, поскольку использует синтаксис XML, просто хотел сыграть в адвокат дьявола :)

0 голосов
/ 04 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...