1. ホーム
  2. Web制作
  3. XML/XSLT

XMLにおけるDTD文書型定義の徹底分析

2022-01-25 11:44:25

DTDは、XML文書の語彙と構造の妥当性を、適切なXML言語の構文規則と照らし合わせてチェックします。

XML DTDは、文書内部で指定することも、別の文書に残しておいて別々にリンクさせることも可能です。

構文
DTDの基本的な構文を以下に示す。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <スパン <!DOCTYPE 要素 DTD 識別子   
  2. [   
  3.     宣言1   
  4.     宣言2   
  5.     ........   
  6. <スパン ] >

上記の構文では

DTDは<!DOCTYPEデリミターで始まる。
要素は、パーサーが指定されたルート要素から文書の解析を開始するように指示するために使用されます。
DTD識別子は、文書型定義に用いる識別子で、システム上のファイルへのパスやインターネット上のファイルへのURLなどがある。DTDが外部パスを参照している場合は、外部サブセットと呼ばれる。内は、内部サブセットと呼ばれるエンティティ宣言のオプションリストです。
内部DTD
内部DTDであるためには、XML宣言のstandalone属性がyesに設定されていなければなりません。これは、宣言が外部ソースから独立して動作することを意味します。

構文

DTDの内部構文を以下に示す。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <スパン <!DOCTYPE root-element [要素宣言]を使用する。 >

ここで、root-elementはルート要素の名前、element-declarationsは宣言した要素を示しています。

以下は、内部DTDの簡単な例です。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <? xml バージョン = "1.0"。 エンコーディング = "UTF-8"。 <スパン スタンドアロン = <スパン "はい"。 ? >
  2. <!DOCTYPE アドレス [...   
  3. <スパン <!ELEMENT アドレス (名前,会社,電話番号) >
  4.     <!ELEMENT name (#PCDATA) >
  5.     <!ELEMENT 会社 (#PCDATA) >
  6.     <!ELEMENT phone (#PCDATA) >
  7. ] >
  8. <スパン <スパン <

    アドレス >
  9. <スパン <スパン <

    名称 > タンメイ・パティル </ 名称 >
  10. <スパン <スパン <

    会社 > チュートリアルポイント </ 会社 >
  11. <スパン <スパン <

    電話 > (011) 123-4567 <スパン </ 電話 >
  12. <スパン <スパン </ アドレス >

上のコードを見てみましょう。

宣言の開始 - 次のステートメントでXML宣言を開始します。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <? xml バージョン = "1.0"。 エンコーディング = "UTF-8"。 <スパン スタンドアロン = <スパン "はい"。 ? >

DTD - XMLヘッダーの直後には、以下のような_文書型宣言_があり、しばしばDOCTYPEと呼ばれる。

<!DOCTYPE アドレス [...
DOCTYPE宣言では、要素名の先頭に感嘆符(!) DOCTYPEは、この文書に関連するDTDが存在することをパーサーに知らせます。

DTD本体 - DOCTYPE宣言のすぐ後にDTD本体があり、要素、属性、実体、シンボルを宣言します。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <スパン <!ELEMENT アドレス (名前,会社,電話番号) >
  2. <!ELEMENT name (#PCDATA) >
  3. <!ELEMENT 会社 (#PCDATA) >
  4. <!ELEMENT phone_no (#PCDATA) >

多くの要素は、ここで <name> 文書語彙によって宣言されます。 <!ELEMENT name (#PCDATA)> element_name_as "#PCDATA" タイプとして定義されます。ここで、#PCDATAはパース可能なテキストデータという意味です。

宣言を閉じる - 最後に、DTDの宣言セクションは角括弧と先の尖った括弧([>)で閉じられます。) これは有効な閉じの定義で、その直後にXMLドキュメントの内容が続きます。

ルール

文書型宣言は、文書の冒頭(XMLヘッダと一緒の最初だけ)に表示しなければならず、文書内の他の場所に表示することは許されません。
DOCTYPE宣言と同様に、要素宣言は感嘆符で始めなければなりません。
文書型宣言のNameは、ルート要素の型と一致しなければならない。
外部DTD
外部 DTD の要素は、XML 文書の外部で宣言されます。外部DTDであることを示すには、XML宣言のstandalone属性をnoに設定する必要があります。これは、宣言が外部からの情報を含んでいることを意味します。

構文

以下は、外部DTDの構文です。

<!DOCTYPE root-element SYSTEM "ファイル名">.SYSTEM "ファイル名">
ここで、file-nameは拡張子が.dtdのファイルです。

次の例は、外部DTDの使用を示しています。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <? xml バージョン = "1.0"。 エンコーディング = "UTF-8"。 <スパン スタンドアロン = <スパン "no"。 ? >
  2. <!DOCTYPE address SYSTEM "address.dtd"。 >
  3. < アドレス >
  4. < 名前 > タンメイ・パティル </ 名前 >
  5. < 会社 > チュートリアルポイント </ 会社 >
  6. < 電話 > (011) 123-4567 </ 電話 >
  7. </ アドレス >
  8. DTDファイルaddress.dtdの中身は次のようになっています。  
  9. <!ELEMENT アドレス (名前,会社,電話) >
  10. <!ELEMENT name (#PCDATA) >
  11. <!ELEMENT 会社 (#PCDATA) >
  12. <!ELEMENT phone (#PCDATA) >

タイプ

外部DTDを参照するには、システム識別子またはパブリック識別子を使用します。

システム識別子

システム識別子により、DTD宣言を含む外部ファイルの場所を指定することができる。構文は以下の通りです。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <スパン <!DOCTYPE name SYSTEM "address.dtd" [...]... >

見ての通り、SYSTEMキーワードとドキュメントの場所へのURI参照が含まれています。

公開識別子

公開識別子は、DTDリソースの位置を特定するための機構を提供し、次のように記述される。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <!DOCTYPE name PUBLIC "-/開始 XML//DTD アドレス例///EN" >

見ての通り、PUBLICキーワードで始まり、すぐにspecialized identifierが続いています。公開識別子は、ディレクトリ内のエントリーを識別するために使用されます。公開識別子はどのような形式でも構いませんが、一般的な形式は正式な公開識別子(またはFPI)です。


要素を宣言する
dtdで要素を宣言する(xmlで要素を合法にしたい場合は、dtdで宣言する必要がある)。
      構文:<!ELEMENT要素名 category>と<!ELEMENT要素名(要素内容)>の両方がある。
<!ELEMENT 要素名 EMPTY>


XML/HTMLコード 内容をクリップボードにコピーする
  1. <スパン <!ELEMENT br EMPTY(要素 br 空白 >

そうすると、xmlは次のように書くことができます。

XML/HTMLコード 内容をクリップボードにコピーする
  1. <スパン < ブラン />

に注意してください。
dtdの中で
すべてのXML文書(およびHTML文書)は、次のような単純な構成要素で成り立っています。
要素
属性

エンティティ
ピーシーデータ
CDATA
以下、注意事項です。
(1)エンティティとは、通常のテキストを定義するために使用される変数です。エンティティ参照は、エンティティへの参照です。
ほとんどの学生はこのHTMLの実体参照を知っています: "&nbsp;". この "行間なし" のエンティティは、HTMLでドキュメントに余分なスペースを挿入するために使用されます。
ドキュメントがXMLパーサーによって解析されるとき、エンティティは展開されます。

(2) PCDATA
PCDATAは、パースされた文字データの略です。
解析された文字データは、XML要素の開始タグと終了タグの間のテキストと考えることができる。
PCDATA は、パーサーが解析するテキストです。このテキストは、パーサーによってタグと同様にエンティティにパースされます。
テキスト中のタグはトークンとして扱われ、エンティティは展開されます。
ただし、解析される文字データには &, <, > という文字が含まれていてはいけません。これらはそれぞれ &amp;, &lt;, &gt; というエンティティに置き換える必要があります。
(3) CDATA
CDATAは文字データを意味します。
CDATAはパーサーによって解析されないテキストです。これらのテキストに含まれるタグはタグとして扱われず、その中の実体は展開されません。