ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  エンジニアのためのXMLスキーマ講座

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:エンジニアのためのXMLスキーマ講座 II(3)

2002年06月15日作成 

エンジニアのためのXMLスキーマ講座
第2回:XMLの標準スキーマ表現 DTDを「読む」

(株)日本ユニテック
竹内 理


目次<全5ページ>

3.DTDを読む-要素型宣言
    おわりに


DTDを読む-要素型宣言

1 <!ENTITY salut "Dear Friends">
2 <!ENTITY % personal-data "name,mail-address">

3 <!ELEMENT email (front,body) >
4 <!ELEMENT front (from,to+,cc*,title) >
5 <!ELEMENT from (%personal-data;) >
6 <!ELEMENT to (%personal-data;) >
7 <!ELEMENT cc (%personal-data;) >
8 <!ELEMENT name (#PCDATA) >
9 <!ELEMENT mail-address (#PCDATA) >
10 <!ELEMENT title (#PCDATA) >
11 <!ELEMENT body (salution?,p*)>
12 <!ELEMENT salution (#PCDATA) >
13 <!ELEMENT p (#PCDATA) >

14 <!ATTLIST email seqnum NMTOKEN #REQUIRED
15                 importance (LOW|HIGH) "LOW">
<リスト1.email.dtd>

リスト1の3行目から13行目までは要素型宣言です。この部分ではXMLインスタンスで使用する要素名や要素の親子関係、要素の内容(「内容モデル」といいます)を指定します。

次にあげるのは要素型宣言の記述の仕方です。

<!ELEMENT 要素名 内容モデル>

内容モデルでは要素間の親子関係、子要素の出現順序、そして子要素の出現回数の3つの指定を表現します。ではその3つの表現の仕方を具体的に見ていきましょう。

<親子関係>
リスト1の3行目はもっとも基本的な形の要素型宣言です。

<!ELEMENT email (front,body) >

これはemail要素の子要素としてfront,bodyの2つの要素が存在するということを示しています。
ちなみに、ある要素の内容モデルの指定の仕方は次のような4つのパターンがあります。

名前説明
要素内容要素のみで構成されている内容モデル。<!ELEMENT email (front,body) >
混在内容テキストのみ、またはテキストと要素が混在している内容モデル。必ず先頭に#PCDATAを記述する。<!ELEMENT li (#PCDATA|l) >
空要素その要素の子供となる要素、またはテキストはない。<!ELEMENT revdate EMPTY>
任意要素 DTDで宣言されている要素であれば、どの要素も任意の順番で子要素として記述する事が出来る。<!ELEMENT others ANY>
<表2.内容モデルの種類>


<出現順序>

内容モデルでは、要素の出現順序も表現します。リスト1の4行目を見てください。

<!ELEMENT front (from,to+,cc?,title) >

ここではfront要素の下に"from"、"to"、"cc"、"title"の4つの子要素が出現することを表していますが、これらの4つの要素が”、”で区切られていることに注目してください。このように”、”で要素と要素が区切られている場合、それらの子要素が並んでいる順番に出現することを示しています。

リスト1にはありませんが、「幾つかある子要素のうち、どれか一つが出現する」ことを表現する書き方もあります。次の例を見てください。

<!ELEMENT li (#PCDATA|l) >

この例は要素"li"の下にテキストもしくは"l"要素のどちらか一方が出現する、ということを示します。"li"の下にテキストがある場合は"l"は存在できず、"l"がある場合はテキストは存在することは出来ません。
内容モデルで使用する出現順序の表現をまとめておきましょう。

記号説明
,内容モデルに書かれた順番に子要素が出現する。<!ELEMENT email (front,body) >
|いずれかひとつが出現する。<!ELEMENT li (#PCDATA|l) >
<表3.出現順序の表現>



<出現回数>

内容モデルで要素の出現回数も表現することが出来ます。例として、リスト1の4行目をもう一度見てみましょう。

<!ELEMENT front (from,to+,cc*,title) >(下線は実際にはありません)

to要素の後ろに”+”記号があることに注目してください。これはfront要素の子要素として、to要素がfrom要素の後に「1回以上いくつでも」出現できることを示しています。front要素の下にはto要素が必ず1回は存在しなければなりません。またcc要素の後ろには”*”記号があります。これはfront要素の子要素としてcc要素が「0回以上いくつでも」出現できることを表しています。この場合front要素の下にはcc要素が無い場合もあります。fromやtitleのようになにも記号がつかない場合は「必ず1回」出現することを表します。

この部分の文書インスタンスは以下のように幾つかのパターンをとることができます。

パターン1
<front>
    <from>…</from>
    <to>…・</to>
    <title>…・</title>
</front>
パターン2
<front>
    <from>…</from>
    <to>…・</to>
    <to>…・</to>
    <title>…・</title>
</front>
パターン3
<front>
    <from>…</from>
    <to>…・</to>
    <to>…・</to>
    <cc>…・</cc>
    <title>…・</title>
</front>
パターン4
<front>
    <from>…</from>
    <to>…・</to>
    <to>…・</to>
    <cc>…・</cc>
    <cc>…・</cc>
    <title>…・</title>
</front>
パターン1ではto要素は1回だけ、パターン2では2回出現しています。cc要素はパターン1、2では出現していませんが、パターン3では1回、パターン4では2回出現しています。

次にリスト1の11行目を見てください。

<!ELEMENT body (salution?,p*)>

ここではsalution要素の後ろに”?”記号があることに注目してください。これはsalution要素が「0回もしくは1回」出現することを示しています。

この部分の文書インスタンスは次のようなパターンをとることが出来ます。

パターン1
<body>
    <salution>…・</salution>
    <p>…・</p>
</body>
パターン2
<body>
    <p>…・</p>
    <p>…・</p>
</body>


パターン1ではsalution要素が一度出現しています。パターン2ではsalution要素は使われていません。

内容モデルで使用する出現回数の表現をまとめておきましょう。
記号説明
なし必ず1回出現する。<!ELEMENT X (A) >
?0回もしくは1回出現する。<!ELEMENT X (A?) >
+1回以上出現する。<!ELEMENT X (A+)>
*0回以上出現する。<!ELEMENT X (A*)>
<表4.出現順序の表現>

ここまでで、内容モデルが表現する親子関係、要素の出現順序と出現回数について見てきました。
これまでは比較的簡単な内容モデルの例ばかりでしたが、実際のDTDではより複雑な内容モデルを表現する必要があります。
そのために幾つかの要素を括弧でくくりグループ化することが出来ます。次の例を見てください。

<!ELEMENT x ((a|b)+,c)>

この例はx要素の子要素として「最初にa要素かb要素のどちらかが1回以上出現し、次にc要素が出現する」ことを意味しています。この部分の文書インスタンスは、以下のようなパターンをとることができます。

パターン1
<x>
    <a>…・</a>
    <c>…・</c>
</x>
パターン2
<x>
    <a>…・</a>
    <a>…・</a>
    <c>…・</c>
</x>
パターン3
<x>
    <b>…・</b>
    <b>…・</b>
    <c>…・</c>
</x>



関連サービス

XMLスキーマの策定、作成業務





ページトップへ戻る