web-dev-qa-db-ja.com

DTDまたはXMLスキーマ。どちらがいいですか?

DTDとXMLスキーマの長所と短所は何ですか(後者の正式名称はわかりません)。どちらが良いですか?同じことをするのに2つの方法が必要なのはなぜですか?

編集:私が読んでいた記事でこれを見つけました、それが私に質問をするように促したものです:

W3C XMLスキーマ言語を使用する理由

W3C XMLスキーマ言語だけがスキーマ言語ではありません。実際、XML仕様では、スキーマを表現する方法として文書型定義(DTD)が記述されています。さらに、プレリリースバージョンのJAXBリファレンス実装はDTDでのみ機能しました。つまり、XMLスキーマ言語で記述されたスキーマでは機能しませんでした。ただし、XMLスキーマ言語はDTDよりもはるかに豊富です。たとえば、XMLスキーマ言語で記述されたスキーマは、DTDで表現できない(または簡単に表現できない)構造関係とデータ型を記述できます。 DTDをW3C XMLスキーマ言語に変換するために利用できるツールがあるため、以前のバージョンのJAXBリファレンス実装で使用したDTDベースのスキーマがある場合、これらのツールを使用してスキーマをXMLスキーマ言語に変換できます。 http://Java.Sun.com/developer/technicalArticles/WebServices/jaxb/#binsch

XML-Schemaが優れている理由を説明する例が欲しいと思います(実際にそうである場合)。

30
les2

http://weblogs.asp.net/rchartier/archive/2006/03/21/440782.aspx から

  • DTDは名前空間を認識しません。

  • DTDは#define#include#ifdef-または、C指向ではなく、省略形の省略形、外部コンテンツ、およびいくつかの条件付き解析を定義する機能。

  • DTDは、XML文書全体を記述します(たとえ「穴」が残っていても)。スキーマは部分を定義できます。

  • XSDには型システムがあります。

  • XSDには、どの要素または属性コンテンツが「どのように見える」かを記述するための、はるかに豊富な言語があります。これは型システムに関連しています。

  • DTDをXMLドキュメントにインラインで配置できますが、XSDを使用してこれを行うことはできません。これは、DTDの方がより安全であることを意味します(1つのバイトストリーム(xml/dtd)を保護するだけでよく、
    複数)。

  • 「有効なXML」の正式な定義にはDTDが必要です。これは非現実的である可能性があるため、不可能ではないにせよ、スキーマの有効性を受け入れる必要がありますが、これはまったく同じではありません。

私の場合、XSDがあれば、XMLのバリデーターを作成するのは非常に簡単です。確かに存在しますが、DTDでこれを見たことはありません。

21
Robert Harvey

数年前には、XMLスキーマではなくDTDを使用する理由がありました(XMLツールでより一般的またはよりよくサポートされていました)。しかし今日では、DTDの代わりにXMLスキーマを使用しない理由はありません。XMLスキーマの方がはるかに強力です。

ただし、XMLスキーマは完全ではありません(XMLスキーマの仕様または本を読んでみてください...)。それ以来、多くの代替案が開発されてきました(Schematron、Examplotron、RelaxNG)。これらはXMLスキーマに比べて技術的な利点があるかもしれませんが、XMLスキーマは今日はるかに普及しているので、代替案が理にかなっているケースはほとんどありません。

10

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

5
Aruna

Relax NG — XML文書を検証するためのもう1つの強力な言語、Schematronおよび [〜#〜] dsdl [〜#〜] からの他のテクノロジーもあります。 NGは非常にシンプルで、人間が読める形式になっています—リラックスNGコンパクトなため、BNFスキームに似たスキームを記述できます。

4