要素の出現回数の指定
ここでは各要素の出現回数についてDTDで指定する方法を見ていきます。
まず今までのページで使っていた下記のXML文書をもう一度見てください。
<?xml version="1.0" encoding="Shift-Jis" ?> <!DOCTYPE 顧客データ[ <!ELEMENT 顧客データ (顧客)> <!ELEMENT 顧客 (名前, 性別, 身体データ)> <!ELEMENT 名前 (#PCDATA)> <!ELEMENT 性別 (#PCDATA)> <!ELEMENT 身体データ (身長, 体重)> <!ELEMENT 身長 (#PCDATA)> <!ELEMENT 体重 (#PCDATA)> ]> <顧客データ> <顧客> <名前>加藤</名前> <性別>女</性別> <身体データ> <身長>150</身長> <体重>48</体重> </身体データ> </顧客> </顧客データ>
このXML文書は「顧客」要素(及びそこに含まれる各要素)は1つだけ記述されていましたが、データを追加して下記のように2つ目の「顧客」要素を追加してみます。
<?xml version="1.0" encoding="Shift-Jis" ?> <!DOCTYPE 顧客データ[ <!ELEMENT 顧客データ (顧客)> <!ELEMENT 顧客 (名前, 性別, 身体データ)> <!ELEMENT 名前 (#PCDATA)> <!ELEMENT 性別 (#PCDATA)> <!ELEMENT 身体データ (身長, 体重)> <!ELEMENT 身長 (#PCDATA)> <!ELEMENT 体重 (#PCDATA)> ]> <顧客データ> <顧客> <名前>加藤</名前> <性別>女</性別> <身体データ> <身長>150</身長> <体重>48</体重> </身体データ> </顧客> <顧客> <名前>佐藤</名前> <性別>男</性別> <身体データ> <身長>170</身長> <体重>65</体重> </身体データ> </顧客> </顧客データ>
XML文書としては問題なさそうですが、この文書をXML Validatorで検証してみます。
上記のようにエラーとなります。では次にDTDの部分を下記のように変更して試してみて下さい。(「顧客データ」のモデルのところに「+」が追加されています)。
<?xml version="1.0" encoding="Shift-Jis" ?>
<!DOCTYPE 顧客データ[
<!ELEMENT 顧客データ (顧客+)>
<!ELEMENT 顧客 (名前, 性別, 身体データ)>
<!ELEMENT 名前 (#PCDATA)>
<!ELEMENT 性別 (#PCDATA)>
<!ELEMENT 身体データ (身長, 体重)>
<!ELEMENT 身長 (#PCDATA)>
<!ELEMENT 体重 (#PCDATA)>
]>
<顧客データ>
<顧客>
<名前>加藤</名前>
<性別>女</性別>
<身体データ>
<身長>150</身長>
<体重>48</体重>
</身体データ>
</顧客>
<顧客>
<名前>佐藤</名前>
<性別>男</性別>
<身体データ>
<身長>170</身長>
<体重>65</体重>
</身体データ>
</顧客>
</顧客データ>
この文書をXML Validatorで検証してみます。
今度は妥当性の検証も問題ありませんでした。
前のページでは説明しませんでしたが、DTD内で要素のモデルを定義するときに、特に何も記述しない場合には、その要素は、その要素の直接の親要素の中に1回しか出現できないというルールがあります。最初の例では「顧客」要素は出現回数を明確に表示していませんでしたので、「顧客」要素の親要素である「顧客データ」要素の中で2回出現したためエラーとなりました。
2つ目の例では「顧客」要素のモデルのところに「+」を追加で記述してあります。「+」は出現回数が"1回以上出現する"という意味を表す記号で、その為「顧客」要素が2回出現してもエラーとはなりませんでした。
ちなみに「顧客」要素に含まれる他の「名前」や「性別」といった要素もXML文書全体で見れば複数回出現しているのですが、それぞれの親要素(この場合はどちらも「顧客」要素)内では1回ずつしか出現していませんので問題はありません。
出現回数の記述方法
では出現回数の指定の方法を見ていきます。出現回数を指定する記号には下記の種類があります。
記号 | 出現可能回数 |
---|---|
+ | 1回以上出現 |
? | 0回か1回出現 |
* | 0回以上出現 |
指定無し | 1回だけ出現 |
そして要素のモデルの右側に記号を記述します。書式は下記のようになります。
<!ELEMENT 要素名 (他の要素名記号)> <!ELEMENT 要素名 (他の要素名1記号, 他の要素名2記号, ...)> <!ELEMENT 要素名 (他の要素名1記号, 他の要素名2記号, ...)記号>
例えば下記のような感じです。
<!DOCTYPE 顧客データ[ <!ELEMENT 顧客データ (顧客+)> <!ELEMENT 顧客 (名前+, 性別, 身体データ?)> ]>
では別のサンプルを試してみます。今までのサンプルに「趣味」という要素を追加し、この要素は0回以上出現できるように定義してみます。
<?xml version="1.0" encoding="Shift-Jis" ?> <!DOCTYPE 顧客データ[ <!ELEMENT 顧客データ (顧客+)> <!ELEMENT 顧客 (名前, 性別, 身体データ, 趣味*)> <!ELEMENT 名前 (#PCDATA)> <!ELEMENT 性別 (#PCDATA)> <!ELEMENT 身体データ (身長, 体重)> <!ELEMENT 身長 (#PCDATA)> <!ELEMENT 体重 (#PCDATA)> <!ELEMENT 趣味 (#PCDATA)> ]> <顧客データ> <顧客> <名前>加藤</名前> <性別>女</性別> <身体データ> <身長>150</身長> <体重>48</体重> </身体データ> </顧客> <顧客> <名前>佐藤</名前> <性別>男</性別> <身体データ> <身長>170</身長> <体重>65</体重> </身体データ> <趣味>読書</趣味> <趣味>スポーツ</趣味> </顧客> </顧客データ>
「趣味」要素は0回以上何回でも出現出来ます。その為、最初の「顧客」要素内では「趣味」は1回も出てきませんが、次の「顧客」要素内では「趣味」要素が複数回出現しています。
以上となります。先ほどの表の通り、記号を指定しない場合の出現回数は「1回出現」となりますので必ず1回は出現する必要があります。省略可能な要素を作成する場合は「?」か「*」を付ける必要がありますので注意して下さい。
( Written by Tatsuo Ikura )