XMLゼミ

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