http://www.sw.it.aoyama.ac.jp/2012/PB1/lecture6.html
© 2006-12 Martin J. Dürst 青山学院大学
例を見ましょう
一人一人が独自に要素や属性を決めると、問題が多発:
→ 決まった要素・属性を定義し、統一
→ これはスキーマの役割
(schema)
それぞれ一長一短だが、これから DTD を中心に勉強
<?xml version="1.0" ?>
<!DOCTYPE Letter [
<!ELEMENT Letter (to, from, Title, Text) >
<!ATTLIST Letter date CDATA #REQUIRED >
<!ELEMENT to (#PCDATA) >
<!ELEMENT from (#PCDATA) >
<!ELEMENT Title (#PCDATA) >
<!ELEMENT Text (#PCDATA) >
]>
<Letter date="2012-04-09">
<to>Students</to>
<from>Martin</from>
<Title>Reminder</Title>
<Text>Please don't forget
your homework.</Text>
</Letter>
<?xml version="1.0" ?> <!DOCTYPE Letter SYSTEM "letter-dtd.dtd" > <Letter date="2012-04-09"> <to>Students</to> <from>Martin</from> <Title>Reminder</Title> <Text>Please don't forget your homework.</Text> </Letter>
ファイル letter-dtd.dtd
:
<!ELEMENT Letter (to, from, Title, Text) >
<!ATTLIST Letter date CDATA #REQUIRED >
<!ELEMENT to (#PCDATA) >
<!ELEMENT from (#PCDATA) >
<!ELEMENT Title (#PCDATA) >
<!ELEMENT Text (#PCDATA) >
整形式 XML (well-formed XML):
妥当な XML (valid XML; 検証済み XML または整合 XML ともいう):
<!DOCTYPE
の次の単語は XML
文書全体を囲むルート要素の名前<!ATTLIST
を探し、開始タグに追加<!ELEMENT
で内容モデルを探すELEMENT
は要素の定義
書式: <!ELEMENT 要素名 内容モデル
>
簡単な内容モデル:
要素の内容が空: EMPTY
テキストのみ: (#PCDATA)
(content model)
順番: (elem1, elem2)
(elem1 の後に
elem2、両方が必要)
例: <!ELEMENT book (data, contents, reviews) >
選択: (elem1 | elem2)
(elem1 又は
elem2、両方は不可能)
例: <!ELEMENT Letter (from, to, (greeting | 挨拶),
text) >
任意: (elem1?)
(elem1 はあってもなくても良い)
例: <!ELEMENT person (familyname?, givenname?, affiliation?)
>
繰り返し (0回以上): (elem1*)
(elem1
は0回以上繰り返す)
例: <!ELEMENT chapter (chaptertitle, section*) >
繰り返し (1回以上): (elem1+)
(elem1
は1回以上繰り返す)
例: <!ELEMENT books (book+) >
この内容モデルは自由に組み合わせることができる
<!ELEMENT titles ((title, subtitle?)|(subtitle,
title))>
可能:
<titles><title>...</title></titles>
<titles><title>...</title><subtitle>...</subtitle></titles>
<titles><subtitle>...</subtitle><title>...</title></titles>
不可能:
<titles></titles>
<titles><title>...</title><title>...</title></titles>
<titles><subtitle>...</subtitle><title>...</title><subtitle>...</subtitle></titles>
など
(mixed content model)
(#PCDATA | elem1 | elem2)*
注意点:
#PCDATA
は最初|
でテキストの中に許す要素を列挙*
をつける例: <!ELEMENT paragraph (#PCDATA|strong)* >
書式 (属性が必要な場合): <!ATTLIST 要素名
属性名 CDATA #REQUIRED >
書式 (属性が任意の場合): <!ATTLIST 要素名
属性名 CDATA #IMPLIED >
例: <!ATTLIST Letter date CDATA #REQUIRED >
5月18日 (金曜日) の 22:00 までに Moodle に投稿。
先週作った本のデータを book.dtd
に合わせて修正、補完 (ファイル名は mybook2.xml)
次のように外部 DTD を使用:
<!DOCTYPE books SYSTEM
"http://www.sw.it.aoyama.ac.jp/2008/PB1/examples/book.dtd" >
属性値などについて、DTD のコメントも考慮
必ず検証してから提出 (検証には W3C の Validator 又は学内のコピーを使用)
複数の人から同じ本についてのデータが出されたら減点
ヒント 1: 作業の順番:
a) 先週作った本のデータを徐々に修正、補足
b)
からのファイルからスタート、<books><book></book></books>
から徐々にデータを作り上げ、先週作ったデータから移す
ヒント 2: 頻繁に検証、先頭のエラーに注目
ヒント 3: DTD 内のコメントをよく読んで、よく守る
ヒント 4: 万が一に Tentatively valid までならなくても、必ず提出