XMLスキーマとDTDの違いは何ですか?


175

私はこの質問をググってみましたが、XMLスキーマとDTD(文書型定義)とは何か、そしてなぜXMLスキーマがDTDに比べて強力なのかを明確に理解していません。

どんなガイダンスもいただければ幸いです。

回答:


135

DTDとスキーマの違いのセクションスキーマに変換するDTDの記事:

DTDとXMLスキーマの重要な違いは、XMLスキーマはXMLベースの構文を使用するのに対し、DTDはSGML DTDから引き継がれた独自の構文を持っていることです。新しい構文を学習する必要があるため、DTDはしばしば批判されますが、構文自体は非常に簡潔です。反対のことは冗長である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">

[...]


1
WTDはXMLスキーマ言語の一種であるとW3Cは考えているようです。「広く使用されているスキーマ言語はいくつかありますが、主なものはドキュメントタイプ定義(DTD)、Relax-NG、Schematron、W3C XSD( XMLスキーマ定義)。 " w3.org/standards/xml/schema
Mordechai

1
@Mordechai XMLスキーマではなくスキーマ言語としてDTDを指定していると思います。
kaartic 2016

89

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

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

更新:2015.08.26

これらの箇条書きのすべてが100%正確であるとは限りませんが、要点はわかります。

一方:

  • DTD を使用すると、XMLファイルで使用する新しいENTITY値を定義できます。
  • DTDを使用すると、ローカルで個々のXMLファイルに拡張できます。

21

以前に多くの人が言及したように、XMLスキーマはXMLベースの構文を利用し、DTDは独自の構文を持っています。DTDは重要なデータ型をサポートしていません。

大学に複数の学生がいて、各学生に「名前」と「年」の2つの要素がある非常に単純な例を見てみましょう。私のコードではコメントのためだけに "//->"を使用していることに注意してください。

ここに画像の説明を入力してください

次に、この例をDTDとXSDの両方で記述します。

DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE university[              // --> university as root element 
<!ELEMENT university (student*)>   // --> university has  * = Multiple students
<!ELEMENT student (name,year)>     // --> Student has elements name and year
<!ELEMENT name (#PCDATA)>          // --> name as Parsed character data
<!ELEMENT year (#PCDATA)>          // --> year as Parsed character data
]>

<university>
    <student>
        <name>
            John Niel             //---> I can also use an Integer,not good
        </name>
        <year>
            2000                 //---> I can also use a string,not good
        </year>
    </student>
</university>

XMLスキーマ定義(XSD)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name ="uniType">                    //--> complex datatype uniType
 <xsd:sequence>
  <xsd:element ref="student" maxOccurs="unbounded"/> //--> has unbounded no.of students
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="stuType">                     //--> complex datatype stuType
 <xsd:sequence>
  <xsd:element ref="name"/>                          //--> has element name
  <xsd:element ref="year"/>                          //--> has element year
 </xsd:sequence>
</xsd:complexType>

<xsd:element name="university" type="uniType"/>       //--> university of type UniType 
<xsd:element name="student" type="stuType"/>          //--> student of type stuType
<xsd:element name="name" type="xsd:string"/>          //--> name of datatype string
<xsd:element name="year" type="xsd:integer"/>         //--> year of datatype integer
</xsd:schema>



<?xml version="1.0" encoding="UTF-8"?>
<university>
    <student>
        <name>
            John Niel          
        </name>
        <year>
            2000                      //--> only an Integer value is allowed
        </year>
    </student>
</university>

16

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


まさに-XSD / XMLスキーマはXMLそのものです-これは本当に良いことです!
marc_s 2009年

うーん、XSDはXML構文だけではありません。たとえば、データ型
ルーベンスファリアス

9

XSDとDTDの類似点

both specify elements, attributes, nesting, ordering, #occurences

XSDとDTDの違い

XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD 

さらに、XSDは少し冗長ですが、その構文はXMLの拡張であるため、すばやく学習するのに便利です。


2
DTDは、よりXSD限り、より制限され#occurencesの唯一の選択肢で10 or 10 or more、XSDは、最小および最大数を指定することができました。
ジェシーチザム2015

8

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

あなたが持っていると仮定すると

  • person要素
  • と呼ばれる子要素 name
  • name自身が子要素を持っているfirstlast

このような

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

場合はcity、同じドキュメント内の要素は、子要素の「name」を持っている必要がDTDは、この「名前」要素が子要素を持たなければならないことを要求firstしてlastも同様に。子供をcity.name必要firstとしないという事実にもかかわらずlast

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

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

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


6

類似点

DTDとスキーマはどちらも同じ基本機能を実行します。

  • まず、どちらも要素と属性のランドリーリストを宣言します。
  • 第2に、どちらもこれらの要素がどのようにグループ化、ネスト、またはXML内で使用されるかを記述します。つまり、ワークフロー内で誰かがXMLファイルを作成できるようにするルールを宣言し、
  • 第3に、DTDとスキーマの両方が、要素のタイプまたは形式を制限または強制するメソッドを提供します。たとえば、DTDまたはスキーマ内で、日付フィールドを強制的に01/05/06または1/5/2006として書き込むことができます。

違い:

  • DTDはテキストを多用するアプリケーションに適していますが、スキーマにはデータを多用するワークフローにいくつかの利点があります。

  • スキーマはXMLで記述されているため、同じルールに従いますが、DTDは完全に異なる言語で記述されます。

例:

DTD:

<?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT employees (Efirstname, Elastname, Etitle, Ephone, Eemail)>
         <!ELEMENT Efirstname (#PCDATA)>
         <!ELEMENT Elastname (#PCDATA)>
         <!ELEMENT Etitle (#PCDATA)>
         <!ELEMENT Ephone (#PCDATA)>
         <!ELEMENT Eemail (#PCDATA)>

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="employees" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:attribute name="generated" type="xsd:dateTime"/>
      </xsd:complexType>
</xsd:element>
<xsd:element name="employees">
      <xsd:annotation>
           <xsd:appinfo>
               <od:index index-name="PrimaryKey" index-key="Employeeid " primary="yes"
                unique="yes" clustered="no"/>
          <od:index index-name="Employeeid" index-key="Employeeid " primary="no" unique="no"
           clustered="no"/>
     </xsd:appinfo>
</xsd:annotation>
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element name="Elastname" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Etitle" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Ephone" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Eemail" minOccurs="0" od:jetType="text"
               od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Ephoto" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
          </xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

4

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

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


DTDには、列挙値と呼ばれるCDATAのサブセットを含めることもできます
ジェシーチザム2015

4

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

短い答えですか?XSDを使用すると、XML構造をより正確に定義できるため、DTDはXSDに代わって廃止されました。


4

XML DTD

DTDの目的は、XMLドキュメントの構造を定義することです。正当な要素のリストで構造を定義します:

<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>

XMLスキーマ

XMLスキーマを使用すると、スキーマの作成者は、要素の数量のデータが数値、​​さらには整数でなければならないことを指定できます。次の例では私が使用しましたstring

<xs:element name="note">
<xs:complexType>
  <xs:sequence>
    <xs:element name="address1" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="state" type="xs:string"/>
    <xs:element name="zip" type="xs:string"/>
  </xs:sequence>
</xs:complexType>


2

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


2
非推奨?いいえ。[XDRは非推奨]時代遅れになりますか?多分。XSDより制限がありますか?はい。XSD機能の機能サブセット?いいえ。構文が複雑すぎますか?ほとんど違いません(私見)。個人的には、DTDはXMLではないため、XSDよりも読みやすくなっています。
ジェシーチザム2015

-7

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

XMLスキーマは、XMLを検証するためのMicrosoftのDTDの代替手段です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.