プログラミング基礎 I

第六回 (2012年 5月14日)

DTD の基本

http://www.sw.it.aoyama.ac.jp/2012/PB1/lecture6.html

Martin J. Dürst

AGU

© 2006-12 Martin J. Dürst 青山学院大学

目次

先週の演習・宿題 2: 本の情報

例を見ましょう

自由自在の XML の限界

一人一人が独自に要素や属性を決めると、問題が多発:

→ 決まった要素・属性を定義し、統一

→ これはスキーマの役割

 

スキーマの役割

(schema)

XML 用のスキーマの種類

それぞれ一長一短だが、これから DTD を中心に勉強

DTD の指定

内部 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>

外部 DTD の一例

<?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 文書の分類

整形式 XML と妥当な XML

整形式 XML (well-formed XML):

妥当な XML (valid XML; 検証済み XML または整合 XML ともいう):

DTD からの XML 文書の作り方

  1. <!DOCTYPE の次の単語は XML 文書全体を囲むルート要素の名前
  2. ルート要素の開始タグと終了タグを書く
  3. ルート要素用の <!ATTLIST を探し、開始タグに追加
  4. ルート要素用の <!ELEMENT で内容モデルを探す
  5. 内容モデルの要素ごとに 2 からのステップを繰り返す

検証のやり方

検証のエラーの読み方

DTD の部品の説明

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)*

注意点:

例: <!ELEMENT paragraph (#PCDATA|strong)* >

属性の定義

書式 (属性が必要な場合): <!ATTLIST 要素名 属性名 CDATA #REQUIRED >

書式 (属性が任意の場合): <!ATTLIST 要素名 属性名 CDATA #IMPLIED >

例: <!ATTLIST Letter date CDATA #REQUIRED >

演習 1: 本のデータを DTD に合わせる

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 までならなくても、必ず提出