Как выбрать DTD и XSD
Я хочу использовать DTD или XSD для описания моего XML-документа. Я читал, что XSD лучше DTD, поскольку они поддерживают пространства имен и типы данных, а DTD старше.
Означает ли это, что я должен использовать только XSD для всех будущих потребностей и полностью игнорировать DTD в качестве опции? Должен ли я даже изучать структуру DTD?
Какие факторы следует учитывать при выборе между XSD и DTD?
Ответы
Ответ 1
Вероятно, важно изучать DTD как отдельное упражнение, просто для того, чтобы знать, как они работают, если вы встретите их где-то в другом месте, и чтобы вы могли оценить некоторые из вещей, которые XSD пытался решить.
Однако, для ваших текущих целей описания XML-документа, действительно придерживайтесь XSD.
Помимо наличия более богатого набора функций (как вы упомянули, включая типы данных и пространства имен), они также сами XML-документы, что может быть действительно полезно. Поскольку они представляют собой XML, вы можете проверить их корректность и достоверность намного проще, и вы можете написать код, который работает с ними, как обычные XML файлы (например, если вы хотите автогенерировать классы кода из схемы)
Ответ 2
Это действительно зависит от того, насколько сложна структура, которую вам нужно настроить.
Если вам нужны такие вещи, как namespacing и datatypes, обязательно пойдите с XSD. Если вам нужна только небольшая схема для проверки, DTD даст вам более высокую производительность, поскольку в ней нет синтаксического анализа XML.
Как я понимаю, XSD получен из DTD, поэтому понимание DTD даст прочную основу для обучения XSD, плюс указать некоторые из коротких предложений DTD.
Ответ 3
Было бы неловко понимать структуру DTD (это поможет вам лучше понять XSD в конечном итоге)... но вы должны использовать XSD, двигаясь вперед.
Ответ 4
Нет вреда в обучении DTD, но обязательно используйте XSD, потому что XSD имеет больше силы,
С XSD вы можете не только проверить структуру/иерархию тегов XML, но также и
- Вы можете определить тип данных
значения узлов. [дата, номер, строка и т.д.]
- Вы также можете определить
data_types, [пример, для node
, возможные данные могут быть
один из 12 месяцев.. так что вам нужно
определить все 12 месяцев в новом
тип данных, записывающий все 12 месяцев
имена в качестве значений перечисления.
валидация показывает ошибку, если вход
XML содержит любое другое значение, чем
эти 12 значений..]
- Вы можете установить ограничение на
появление элементов, используя
minOccurs и maxOccurs, значение по умолчанию
значения равны 1 и 1.
.. и многое другое...
Существуют некоторые ограничения: как будто,
- Элемент (имя), определенный в файле XSD
должен быть определен только с одним типом данных.
- Вы не можете проверить атрибут node/
используя значение другого
node/атрибут.
Ответ 5
Существует очень важная проблема IMHO для использования DTD (возможно, вместе с XSD, если вам нужна глубокая проверка):
В DTD вы можете определить свои собственные объекты, например:
<!ENTITY MyName "DrDr.Hannibal Xerxes Utah,MBA and CEO">
В вашем документе вы можете там, где вам нужно просто code & 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",
Теперь вы можете запрограммировать свой мастер-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 и habe, чтобы не касаться или копировать
сам книжный список, кроме того, вы можете обслуживать его в одном месте и иметь все изменения в любом документе.
Ответ 6
Это старая строка, но в случае, если кто-то еще сталкивается с ней... из того, что я могу сказать, DTD все еще имеет два преимущества, которые XSD не делает, а именно включение функции ENTITY, которая не существует в XSD. Это довольно удивительная функция, которая сообщает компилятору, как обрабатывать потенциально незнакомые типы файлов, определяя, какие программы открывать для их обработки.
Кроме того, DTD записываются в спецификацию XML, поэтому они могут быть записаны непосредственно в XML-документы, тогда как XSD должен существовать как внешний файл и подключаться. Не очень важно, особенно при использовании в больших документах.
Я думаю, что XSD все еще намного лучше и естественнее, поскольку он использует синтаксис XML, просто хотел играть адвоката дьявола:)
Ответ 7
XML Schema может выполнять более сложные проверки.
Например, если DTD проверяет, что тип данных XML-элемента является целым или строковым. Схема XML может выполнять более сложные проверки, например, если элемент xml представляет собой строку, начинающуюся с буквы верхнего регистра или положительного целого числа. Наконец, в XML-схеме используется синтаксис XML и его естественный выбор для разработки веб-сервисов.