web-dev-qa-db-ja.com

DTDとXSDのどちらを選択するか

XML文書の記述にDTDまたはXSDのいずれかを使用したいと思います。 XSDは名前空間とデータ型をサポートするため、DTDよりも優れていること、およびDTDが古いことを読みました。

これは、将来のすべてのニーズに対してのみXSDを使用し、オプションとしてDTDを完全に無視する必要があることを意味しますか?わざわざDTDの構造を学ぶ必要がありますか?

XSDとDTDのどちらを選択する場合、どのような要素を考慮すべきですか?

49
ajsie

XTDが解決しようとしていたことのいくつかを理解できるように、DTDを別の演習として学習することはおそらく重要です。

ただし、XML文書を記述するという現在の目的では、確かにXSDを使用してください。

はるかに豊富な機能セット(データ型や名前空間を含む)に加えて、それらもXMLドキュメントであり、非常に便利です。それらはXMLであるため、整形式と有効性をはるかに簡単に確認でき、通常のXMLファイルのようにそれらと連携するコードを記述できます(たとえば、スキーマからコードクラスを自動生成する場合)

45
Mike Mooney

それは本当にあなたがセットアップする必要がある構造がいかに複雑であるかに依存します。

名前空間やデータ型などが必要な場合は、必ずXSDを使用してください。チェックするスキーマが少しだけ必要な場合は、XML解析が含まれていないため、DTDを使用するとパフォーマンスが向上します。

私が理解しているように、XSDはDTDから派生しているため、DTDを理解することでXSDを学習するための強固な基盤が得られ、さらにDTDの短所のいくつかが指摘されます。

8
Brant

DTDの構造を理解しても害はありません(長期的にはXSDをよりよく理解するのに役立ちます)...しかし、今後はXSDを使用する必要があります。

6
Justin Niessner

DTDの学習に害はありませんが、必ずXSDを使用してください。XSDの方が強力です。

XSDを使用すると、XMLタグの構造/階層を検証できるだけでなく、

  1. ノードの値のデータ型を定義できます。 [日付、数値、文字列など]
  2. また、カスタムdata_typesを定義することもできます(たとえば、nodeの場合、可能なデータは12か月のいずれかになります。したがって、12か月すべての名前を列挙値として書き込む新しいデータ型で12か月すべてを定義する必要があります。入力XMLにこれらの12個の値以外の値が含まれている場合、検証でエラーが表示されます。
  3. 要素の出現を制限するには、minOccursおよびmaxOccursを使用します。デフォルト値は1および1です。

.. などなど ...

いくつかの制限があります:のように

  1. XSDファイルで定義されたelement(name)は、1つのデータ型のみで定義する必要があります。
  2. 別のノード/属性の値を使用してノード/属性を検証することはできません。
5

DTDを使用するには、非常に重要なIMHOの問題があります(詳細な検証が必要な場合は、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をコーディングするだけで、ブックリスト自体に触れたりコピーしたりする必要がありません。さらに、1か所でメンテナンスして、すべてのドキュメントにすべての変更を加えることができます。

3
MikeTheGuru

これは古い文字列ですが、他の誰かがそれに遭遇した場合に備えて... DTDには、XSDにはない2つの利点があります。つまり、XSDに存在しないENTITY関数が含まれています。これは非常に素晴らしい機能であり、見慣れない可能性のあるファイルタイプを処理するためにどのプログラムを開くかを識別することにより、それらを処理する方法をコンパイラーに指示します。

また、DTDはXML仕様に書き込まれるため、XML文書に直接書き込むことができますが、XSDは外部ファイルとして存在し、接続されている必要があります。とにかく大きなドキュメントで使用する場合は特に問題ではありません。

XSDはXML構文を使用しているため、はるかに優れていてより自然であり、悪魔の支持者を演じたかっただけだと思います:)

2
Joel

XMLスキーマは、より複雑な検証を実行できます。たとえば、DTDがXML要素のデータ型をチェックする場合、整数または文字列です。XML要素が大文字で始まる文字列または正の整数である場合など、XMLスキーマはより複雑な検証を実行できます。最後に、XMLスキーマはXML構文を使用します。これは、Webサービスの開発に自然な選択肢です。

0
Rohit Goyal