193

この質問をグーグルで検索しましたが、XML スキーマと DTD (文書型定義) とは何か、なぜ XML スキーマが DTD よりも強力なのかがよくわかりません。

ガイダンスをいただければ幸いです。

4

12 に答える 12

149

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">

[...]

于 2009-10-09T15:01:37.877 に答える
96

XML スキーマ定義 (XSD) とドキュメント タイプ定義 (DTD) の違いは次のとおりです。

  • XML スキーマは XML で記述されますが、DTD は SGML 構文から派生します。
  • XML スキーマは要素と属性のデータ型を定義しますが、DTD はデータ型をサポートしていません。
  • XML スキーマでは名前空間がサポートされますが、DTD ではサポートされません。
  • XML スキーマは子要素の数と順序を定義しますが、DTD は定義しません。
  • XML スキーマは XML DOM を使用して独自に操作できますが、DTD の場合はできません。
  • XML スキーマを使用するユーザーは新しい言語を習得する必要はありませんが、DTD を使用することはユーザーにとって困難です。
  • XML スキーマは安全なデータ通信を提供します。つまり、送信者は受信者が理解できる方法でデータを記述できますが、DTD の場合、受信者がデータを誤解する可能性があります。
  • XML スキーマは拡張可能ですが、DTD は拡張可能ではありません。

これらの箇条書きのすべてが 100% 正確というわけではありませんが、要点は理解できます。

一方で:

  • DTDを使用すると、XML ファイルで使用する新しいENTITY値を定義できます。
  • DTD を使用すると、それを個々の XML ファイルにローカルに拡張できます。
于 2012-05-15T20:30:14.897 に答える
18

DTD は XML より前から存在するため、XML 自体は有効ではありません。それがおそらく XSD の発明の最大の理由です。

于 2009-10-09T14:40:37.557 に答える
9

1つの違いは、DTDでは、要素のコンテンツモデルは、ドキュメント内のどこに表示されているかに関係なく、その名前によって完全に決定されることです。

あなたがしたいと仮定して

  • person要素_
  • と呼ばれる子要素を持つname
  • それname自体には子要素firstとがありlastます。

このような

   <person>
       <name>
            <first></first>
            <last></last>
       </name>
   </person>

同じドキュメント内のcity要素にも子要素'name'が必要な場合、DTDでは、この'name'要素にも子要素が必要firstですlast。を必要とcity.nameしないという事実にもかかわらず、子供として。firstlast

対照的に、XMLスキーマでは、子要素タイプをローカルで宣言できます。両方と別々にname子要素を宣言できます。したがって、それらのコンテキストで適切なコンテンツモデルを提供します。personcity

他の大きな違いは、名前空間のサポートです。DTDは元のXML仕様の一部である(そしてSGMLから継承されている)ため、XML名前空間は後で指定されたため、名前空間をまったく認識しません。DTDは名前空間と組み合わせて使用​​できますが、任意のプレフィックスを使用する代わりに、DTDでプレフィックスを定義し、それらのプレフィックスのみを使用するなど、いくつかのゆがみが必要です。

私にとって、他の違いはほとんど表面的なものです。データ型のサポートはDTDに簡単に追加でき、構文は単なる構文です。(私は、たとえば、XMLスキーマの構文がひどいので、XMLスキーマを手作業で保守したくありません。DTDやRELAX NGスキーマについては言いません。何らかの理由でXMLスキーマが必要な場合は、通常、次のように記述します。 RELAX NGを使用して変換しtrangます。)

于 2009-10-10T18:35:28.983 に答える
4

XML が最初に登場したとき、XML によってすべての問題が解決されると言われました。XML は使いやすく、無限に拡張可能で、強い型付けを回避し、プログラミング スキルを必要としません。私は DTD について学び、独自の XML パーサーを作成しました。15 年以上経った今、ほとんどの XML はユーザーフレンドリーではなく、(使用法によっては) あまり拡張可能ではないことがわかりました。何人かの巧妙な下駄が XML をデータベースに接続した途端、私はデータ型がほとんど避けられないことを知りました。そして、先日作業しなければならなかった XSLT (変換ファイル) が表示されます。それがプログラミングじゃないなら、何がプログラミングなのかわからない!今日では、XML データやインターフェースに関連するあらゆる種類の問題が発生することは珍しくありません。私は XML が大好きですが、当初の利他主義的な出発点からはかけ離れています。

簡単な答えは?XSD を使用すると XML 構造をより正確に定義できるため、DTD は非推奨になり、XSD が優先されます。

于 2015-09-08T12:31:05.053 に答える
4

DTD は、CDATA と PCDATA の 2 種類のデータのみを持つことができます。ただし、スキーマでは、プログラミング言語で使用するすべてのプリミティブ データ型を使用でき、独自のカスタム データ型を柔軟に定義できます。

スキーマを構築する開発者は、コア データ型に基づいて、さまざまな演算子と修飾子を使用して、カスタム データ型を作成できます。

于 2012-04-12T18:08:41.980 に答える
2

DTD は、スキーマ言語としての有用性が制限されており、名前空間をサポートしておらず、データ型をサポートしていないため、ほとんど推奨されていません。さらに、DTD の構文は非常に複雑であるため、理解と維持が困難です。

于 2009-10-09T18:19:20.850 に答える
-7

DTD は XML 要素の構文を示します

XML スキーマは、XML を検証するための Microsoft の DTD に代わるものです。

于 2012-02-08T12:50:44.180 に答える