回答:
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">
[...]
XMLスキーマ定義(XSD)とドキュメントタイプ定義(DTD)の違いは次のとおりです。
更新:2015.08.26
これらの箇条書きのすべてが100%正確であるとは限りませんが、要点はわかります。
一方:
以前に多くの人が言及したように、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>
DTDはXMLよりも古いため、XML自体は有効ではありません。それがおそらくXSDの発明の最大の理由です。
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
さらに、XSDは少し冗長ですが、その構文はXMLの拡張であるため、すばやく学習するのに便利です。
1
、0 or 1
、0 or more
、XSDは、最小および最大数を指定することができました。
1つの違いは、DTDでは要素のコンテンツモデルは、ドキュメント内のどこに表示されるかに関係なく、その名前によって完全に決定されることです。
あなたが持っていると仮定すると
person
要素name
name
自身が子要素を持っているfirst
とlast
。このような
<person>
<name>
<first></first>
<last></last>
</name>
</person>
場合はcity
、同じドキュメント内の要素は、子要素の「name」を持っている必要がDTDは、この「名前」要素が子要素を持たなければならないことを要求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
ます。)
類似点:
DTDとスキーマはどちらも同じ基本機能を実行します。
違い:
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>
DTDには、CDATAとPCDATAの2種類のデータしか含めることができません。ただし、スキーマでは、プログラミング言語で使用するすべてのプリミティブデータ型を使用でき、独自のカスタムデータ型を柔軟に定義できます。
スキーマを作成する開発者は、コアデータ型に基づいて、さまざまな演算子と修飾子を使用して、カスタムデータ型を作成できます。
XMLが最初に登場したとき、それはすべての問題を解決するだろうと言われました。XMLはユーザーフレンドリーで無限に拡張可能で、厳密な型指定を回避し、プログラミングスキルを必要としません。DTDについて学び、独自のXMLパーサーを作成しました。15年以上後、ほとんどのXMLはユーザーフレンドリーではなく、あまり拡張性がありません(使用方法によって異なります)。いくつかの賢い詰まりがXMLをデータベースに接続するやいなや、私はデータ型がすべて避けられないことを知った。そして、先日作業しなければならなかったXSLT(変換ファイル)が表示されます。それがプログラミングでないなら、私は何であるかわかりません!今日では、XMLデータまたはインターフェイスに関連するあらゆる種類の問題が発生することは珍しくありません。私はXMLが大好きですが、元の利他的な出発点からはかけ離れています。
短い答えですか?XSDを使用すると、XML構造をより正確に定義できるため、DTDはXSDに代わって廃止されました。
DTDの目的は、XMLドキュメントの構造を定義することです。正当な要素のリストで構造を定義します:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
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>
DTDは、スキーマ言語としての有用性に制限があり、名前空間をサポートしておらず、データ型をサポートしていないため、ほとんど非推奨です。さらに、DTDの構文は非常に複雑で、理解と保守が困難です。