XMLゼミ 3.5 DTD M2 正木 裕一
DTDとは DTD(Document Type Definition) DTDの形式 XML文書内容の構造を定義する最も基本的な方法 W3Cの仕様XML1.0に規定されている ※実際には先週のゼミで説明があったXML Schemaなどの方がよく使われる DTDの形式 DTDとははタグ付き文書の要素の名前や順序などを定義したもの文書型宣言の中に必要な宣言を必要なだけ定義する ※XML SchemaのようにDTD文書として別ファイルにすることも可能 <!DOCTYPE 名前[ <!--- コメント---> (宣言のリスト) ]> コメントを挿入することも可能
DTDに定義できる内容 特徴 要素型宣言が少なくとも1つ必要 XML文書の構造に対応していれば宣言の順序は自由 意味 要素型宣言(ELEMENT) XMLインスタンスで使用できる要素、要素名、階層を定義 属性リスト(ATTLIST) 属性のリストを宣言 実体宣言(ENTITY) 実体(文字、文字列、読み込むファイル)を宣言 記法宣言(NOTATION) 外部ファイルとして参照するXML以外の形式を定義 特徴 要素型宣言が少なくとも1つ必要 XML文書の構造に対応していれば宣言の順序は自由 (例)属性が無いXML文書の構造の場合要素型宣言のみでも可
DTDを含むXML文書の例 <!DOCTYPEの後の名前とルート要素の名前が一致 宣言リスト <?xml version="1.0" encoding="UTF-16" ?> <!DOCTYPE 連絡先[ <!ELEMENT 連絡先 (氏名+) > <!ELEMENT 氏名 (#PCDATA) > <!ATTLIST 氏名 CODE CDATA #REQUIRED TEL CDATA #IMPLIED FAX CDATA #IMPLIED> ]> <連絡先> <氏名 CODE="002525" TEL="2525-0110" FAX="2525-0111">ニ戸 丹子</氏名> <氏名 CODE="004111" TEL="1111-0110" FAX="1111-0111">世衣 犬太</氏名> </連絡先> <!DOCTYPEの後の名前とルート要素の名前が一致 宣言リスト
要素宣言(ELEMENT) DTDの要素宣言 <!ELEMENT 要素名 内容モデル> 内容モデルとして指定可能な値:他の要素名、テキスト (テキストは#PCDATAで表す)組み合わせも可能 出現回数の指定可能な値 記号 例 意味 指定無し <!ELEMENT A (B)> 必ず一回出現 ? <!ELEMENT A (B?)> 0回か1回出現 + <!ELEMENT A (B+)> 1回以上出現 * <!ELEMENT A (B)*> いくつあっても無くてもいい 組み合わせの指定シンボル シンボル 例 意味 , <!ELEMENT A (B,C)> AにはB→Cという順番で1つずつ必ずある | <!ELEMENT A (B|C)> AにはBかCという要素が1つある * <!ELEMENT A (B,C*)> AにはBという要素があり、その後にCがいくつあってもまたは無くてもよい
属性宣言(ATTLIST) DTDの属性宣言 属性値の種類 既定値の種類 属性名2 属性値の種類 “既定値”> … 属性名n 属性値の種類 “既定値”> 複数の属性を定義することも可能 属性値の種類 既定値の種類 種類 意味 CDATA 文字データ ID 識別子 IDREF 識別子の参照に使う属性値 NMTOKEN(S) 名前トークン NOTATION 記法宣言参照 ENTITY(IES) 実体参照値 種類 意味 属性値 “”で囲んだ値 #FIXED 属性値を変更できないことを示す #IMPLIED 属性値が省略された場合の動作はアプリケーションに依存 #REQUIRED 属性の指定が必須
実体宣言(ENTITY) DTDの実体宣言 <!ENTITY 実体名 “実体参照の際に置き換える文字列”> <?xml version="1.0" encoding="UTF-16" ?> <!DOCTYPE 書籍リスト[ <!ENTITY TITLE "独習XML"> <!ELEMENT 書籍 (表題) > <!ELEMENT 表題 (#PCDATA)> ]> <書籍リスト> <書籍> <表題>&TITLE;</表題> </書籍> </書籍リスト>
外部実体(外部エンティティ) A B DTDの外部実体 <!ENTITY 記法名 SYSTEM “記法を特定するオブジェクトのURL”> <!ENTITY 記法名 PUBLIC “公開識別子” “記法を特定するオブジェクトのURL”> <?xml version="1.0" encoding="UTF-16" ?> <氏名 CODE="002525" TEL="2525-0110" FAX="2525-0111">ニ戸 丹子</氏名> <氏名 CODE="004111" TEL="1111-0110" FAX="1111-0111">世衣 犬太</氏名> A <?xml version="1.0" encoding="UTF-16" ?> <氏名 CODE="003225" TEL="2424-0110" FAX="2424-0111">須藤 元気</氏名> <氏名 CODE="098611" TEL="5555-0110" FAX="5555-0111">山本 徳郁</氏名> B
外部実体の例 A B <?xml version="1.0" encoding="UTF-16" ?> <!DOCTYPE 連絡先[ <!ELEMENT 連絡先 (氏名?) > <!ELEMENT 氏名 (#PCDATA) > <!ATTLIST 氏名 CODE CDATA #REQUIRED TEL CDATA #IMPLIED> <!ENTITY adrbook1 SYSTEM "A.xml"> <!ENTITY adrbook2 SYSTEM "B.xml"> ]> <連絡先> &adrbook1; &adrbook2; </連絡先> A B
記法宣言(NOTATION) XML以外の記法(イメージ、サウンドなど)の情報を使っている場合に識別するための別名を指定する DTDの記法宣言 <!NOTATION 記法名 SYSTEM “記法を特定するオブジェクトのURL”> <!NOTATION 記法名 PUBLIC “公開識別子” “記法を特定するオブジェクトのURL”> ※記法宣言したXML文書全体を記法指定つき実体という ATTLISTの記法宣言 <!ATTLIST 要素名 属性名 NOTATION 記法名候補 デフォルト値> 宣言したURLや識別子が表すものの内容についてはXMLの仕様で決められていない 記法宣言は一般的にプラットフォームに依存するので現在はあまり使われていない
宿題 XML文書を二つ作成し、外部実体によって表示する
DTDファイル XML文書 <!ELEMENT 連絡先 (氏名+) > <!ELEMENT 氏名 (#PCDATA) > <!ATTLIST 氏名 CODE CDATA #REQUIRED TEL CDATA #IMPLIED FAX CDATA #IMPLIED> XML文書 <?xml version="1.0" encoding="UTF-16" ?> <!DOCTYPE 連絡先 SYSTEM "adrs.dtd"> <連絡先> <氏名 CODE="003225" TEL="2424-0110" FAX="2424-0111">須藤 元気</氏名> <氏名 CODE="098611" TEL="5555-0110" FAX="5555-0111">山本 徳郁</氏名> </連絡先>