この質問をグーグルで検索しましたが、XML スキーマと DTD (文書型定義) とは何か、なぜ XML スキーマが DTD よりも強力なのかがよくわかりません。
ガイダンスをいただければ幸いです。
Converting a DTD into a Schema記事の「DTD とスキーマの違い」セクションから:
DTD と XML スキーマの決定的な違いは、XML スキーマが XML ベースの構文を使用するのに対し、DTD には SGML DTD から継承された独自の構文があることです。DTD は、新しい構文を学習する必要があるため、しばしば批判されますが、構文自体は非常に簡潔です。XML スキーマの場合はその逆です。XML スキーマは冗長ですが、タグと XML も使用するため、XML の作成者は XML スキーマの構文をより簡単に理解できます。
DTD の目標は、SGML DTD を XML DTD に変換するアプリケーションのために、SGML との互換性レベルを維持することでした。ただし、XML の目標の 1 つである「XML マークアップの簡潔さは重要ではありません」に沿って、構文を簡潔に保つことに実際の懸念はありません。
[...]
では、DTD を変換する際に特に重要となるその他の違いにはどのようなものがあるでしょうか? 見てみましょう。
タイピング
DTD と XML スキーマの最も大きな違いは、スキーマでデータ型を作成し、要素と属性の宣言と組み合わせて使用できることです。実際、XML スキーマ勧告の半分がデータ型と XML スキーマに費やされているほど重要な違いです。データ型については、この本の第 III 部「XML スキーマ データ型」で詳しく説明します。
[...]
発生制約
DTD とスキーマが大きく異なるもう 1 つの領域は、オカレンスの制約です。第 2 章「スキーマ構造」の前の例 (または DTD を使用した独自の作業) を思い出すと、要素の出現回数を制限するために使用できる 3 つの記号 (*、+、および ?) があります。
[...]
列挙
要素があり、シャツのサイズ属性を定義できるようにしたいとしましょう。これにより、ユーザーはサイズを小、中、大から選択できます。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">
[...]
XML スキーマ定義 (XSD) とドキュメント タイプ定義 (DTD) の違いは次のとおりです。
これらの箇条書きのすべてが 100% 正確というわけではありませんが、要点は理解できます。
一方で:
DTD は XML より前から存在するため、XML 自体は有効ではありません。それがおそらく XSD の発明の最大の理由です。
1つの違いは、DTDでは、要素のコンテンツモデルは、ドキュメント内のどこに表示されているかに関係なく、その名前によって完全に決定されることです。
あなたがしたいと仮定して
person
要素_name
name
自体には子要素first
とがありlast
ます。このような
<person>
<name>
<first></first>
<last></last>
</name>
</person>
同じドキュメント内のcity
要素にも子要素'name'が必要な場合、DTDでは、この'name'要素にも子要素が必要first
ですlast
。を必要とcity.name
しないという事実にもかかわらず、子供として。first
last
対照的に、XMLスキーマでは、子要素タイプをローカルで宣言できます。両方と別々にname
子要素を宣言できます。したがって、それらのコンテキストで適切なコンテンツモデルを提供します。person
city
他の大きな違いは、名前空間のサポートです。DTDは元のXML仕様の一部である(そしてSGMLから継承されている)ため、XML名前空間は後で指定されたため、名前空間をまったく認識しません。DTDは名前空間と組み合わせて使用できますが、任意のプレフィックスを使用する代わりに、DTDでプレフィックスを定義し、それらのプレフィックスのみを使用するなど、いくつかのゆがみが必要です。
私にとって、他の違いはほとんど表面的なものです。データ型のサポートはDTDに簡単に追加でき、構文は単なる構文です。(私は、たとえば、XMLスキーマの構文がひどいので、XMLスキーマを手作業で保守したくありません。DTDやRELAX NGスキーマについては言いません。何らかの理由でXMLスキーマが必要な場合は、通常、次のように記述します。 RELAX NGを使用して変換しtrang
ます。)
XML が最初に登場したとき、XML によってすべての問題が解決されると言われました。XML は使いやすく、無限に拡張可能で、強い型付けを回避し、プログラミング スキルを必要としません。私は DTD について学び、独自の XML パーサーを作成しました。15 年以上経った今、ほとんどの XML はユーザーフレンドリーではなく、(使用法によっては) あまり拡張可能ではないことがわかりました。何人かの巧妙な下駄が XML をデータベースに接続した途端、私はデータ型がほとんど避けられないことを知りました。そして、先日作業しなければならなかった XSLT (変換ファイル) が表示されます。それがプログラミングじゃないなら、何がプログラミングなのかわからない!今日では、XML データやインターフェースに関連するあらゆる種類の問題が発生することは珍しくありません。私は XML が大好きですが、当初の利他主義的な出発点からはかけ離れています。
簡単な答えは?XSD を使用すると XML 構造をより正確に定義できるため、DTD は非推奨になり、XSD が優先されます。
DTD は、CDATA と PCDATA の 2 種類のデータのみを持つことができます。ただし、スキーマでは、プログラミング言語で使用するすべてのプリミティブ データ型を使用でき、独自のカスタム データ型を柔軟に定義できます。
スキーマを構築する開発者は、コア データ型に基づいて、さまざまな演算子と修飾子を使用して、カスタム データ型を作成できます。
DTD は、スキーマ言語としての有用性が制限されており、名前空間をサポートしておらず、データ型をサポートしていないため、ほとんど推奨されていません。さらに、DTD の構文は非常に複雑であるため、理解と維持が困難です。
DTD は XML 要素の構文を示します
XML スキーマは、XML を検証するための Microsoft の DTD に代わるものです。