web-dev-qa-db-ja.com

XML SchemaとDTDの違いは何ですか?

私はこの質問をグーグルで調べましたが、XMLスキーマとDTD(ドキュメントタイプ定義)とは何か、そしてXMLスキーマがDTDと比較してより強力である理由を明確に理解していません。

どんなガイダンスでも大歓迎です。

156
Rachel

DTDをスキーマに変換する 記事の 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 Schema勧告の半分がデータ型と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は、要素のテキストコンテンツの列挙を提供しません。ただし、スキーマのデータ型のため、前の例で列挙型を宣言したときに、実際にsize_valuesというsimpleTypeを作成しました。これを要素で使用できます。

<xs:element name="size" type="size_value">

[...]

122
Pascal Thivent

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

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

UPDATE:2015.08.26

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

一方:

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

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

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

enter image description here

次に、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>
17
N Randhawa

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

16
troelskn

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の拡張であり、高速に学習するのに便利です。

8
krishna_kp

1つの違いは、DTDでは、要素のコンテンツモデルは、ドキュメントのどこに表示されるかに関係なく、その名前によって完全に決定されることです。したがって、name要素のperson子要素には、firstおよびlastという子要素が含まれているとします。次に、同じドキュメント内のname要素に対してcity子要素を使用する場合は、firstおよびlastの子要素も必要です。対照的に、XMLスキーマでは子要素型をローカルで宣言できるため、この場合、namepersonの両方に対してcity子要素を別々に宣言し、それらのコンテキストで適切なコンテンツモデルを与えることができます。

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

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

7
JaakkoK

類似性

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

  • まず、両方とも要素と属性のランドリーリストを宣言します。
  • 第二に、両方ともこれらの要素が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>
6
ACV

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

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

4
Nirav Daraniya

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

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

4
Robert

XML DTD

DTDの目的は、XMLドキュメントの構造を定義することです。有効な要素のリストを使用して構造を定義します。

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

XMLスキーマ

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

<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>
4
Doro

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

2
vtd-xml-author