私はこの質問をグーグルで調べましたが、XMLスキーマとDTD(ドキュメントタイプ定義)とは何か、そしてXMLスキーマがDTDと比較してより強力である理由を明確に理解していません。
どんなガイダンスでも大歓迎です。
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">
[...]
XMLスキーマ定義(XSD)とドキュメントタイプ定義(DTD)の違いは次のとおりです。
UPDATE: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つの違いは、DTDでは、要素のコンテンツモデルは、ドキュメントのどこに表示されるかに関係なく、その名前によって完全に決定されることです。したがって、name
要素のperson
子要素には、first
およびlast
という子要素が含まれているとします。次に、同じドキュメント内のname
要素に対してcity
子要素を使用する場合は、first
およびlast
の子要素も必要です。対照的に、XMLスキーマでは子要素型をローカルで宣言できるため、この場合、name
とperson
の両方に対してcity
子要素を別々に宣言し、それらのコンテキストで適切なコンテンツモデルを与えることができます。
もう1つの大きな違いは、名前空間のサポートです。 DTDは元のXML仕様の一部である(SGMLから継承されている)ため、後でXML名前空間が指定されたため、名前空間を認識しません。 DTDはネームスペースと組み合わせて使用できますが、DTDでプレフィックスを定義することを強制し、任意のプレフィックスを使用する代わりにそれらのプレフィックスのみを使用するなど、いくつかのゆがみが必要です。
私にとって、他の違いはほとんど表面的なものです。データ型サポートはDTDに簡単に追加でき、構文は単なる構文です。 (私は、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を支持して廃止されました。
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>
DTDは、スキーマ言語としての有用性が制限され、名前空間をサポートせず、データ型をサポートしないため、ほとんど非推奨です。さらに、DTDの構文は非常に複雑であり、理解および保守が困難です。