要素の出現回数の指定

広告

各要素の出現回数についてDTDで指定する方法について解説します。

まず今までのページで使っていた下記のXML文書をもう一度見てください。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE 顧客データ[
  <!ELEMENT 顧客データ (顧客)>
  <!ELEMENT 顧客 (名前, 性別, 身体データ)>
  <!ELEMENT 名前 (#PCDATA)>
  <!ELEMENT 性別 (#PCDATA)>
  <!ELEMENT 身体データ (身長, 体重)>
  <!ELEMENT 身長 (#PCDATA)>
  <!ELEMENT 体重 (#PCDATA)>
]>

<顧客データ>
    <顧客>
        <名前>加藤</名前>
        <性別>女</性別>
        <身体データ>
            <身長>150</身長>
            <体重>48</体重>
        </身体データ>
    </顧客>
</顧客データ>

このXML文書は「顧客」要素(及びそこに含まれる各要素)は1つだけ記述されていましたが、データを追加して下記のように2つ目の「顧客」要素を追加してみます。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE 顧客データ[
  <!ELEMENT 顧客データ (顧客)>
  <!ELEMENT 顧客 (名前, 性別, 身体データ)>
  <!ELEMENT 名前 (#PCDATA)>
  <!ELEMENT 性別 (#PCDATA)>
  <!ELEMENT 身体データ (身長, 体重)>
  <!ELEMENT 身長 (#PCDATA)>
  <!ELEMENT 体重 (#PCDATA)>
]>

<顧客データ>
    <顧客>
        <名前>加藤</名前>
        <性別>女</性別>
        <身体データ>
            <身長>150</身長>
            <体重>48</体重>
        </身体データ>
    </顧客>

    <顧客>
        <名前>佐藤</名前>
        <性別>男</性別>
        <身体データ>
            <身長>170</身長>
            <体重>65</体重>
        </身体データ>
    </顧客>
</顧客データ>

XML文書としては問題なさそうですが、この文書をXML Validatorで検証してみます。

p4-1

p4-2

上記のようにエラーとなります。では次にDTDの部分を下記のように変更して試してみて下さい。(「顧客データ」のモデルのところに「+」が追加されています)。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE 顧客データ[
  <!ELEMENT 顧客データ (顧客+)>
  <!ELEMENT 顧客 (名前, 性別, 身体データ)>
  <!ELEMENT 名前 (#PCDATA)>
  <!ELEMENT 性別 (#PCDATA)>
  <!ELEMENT 身体データ (身長, 体重)>
  <!ELEMENT 身長 (#PCDATA)>
  <!ELEMENT 体重 (#PCDATA)>
]>

<顧客データ>
    <顧客>
        <名前>加藤</名前>
        <性別>女</性別>
        <身体データ>
            <身長>150</身長>
            <体重>48</体重>
        </身体データ>
    </顧客>

    <顧客>
        <名前>佐藤</名前>
        <性別>男</性別>
        <身体データ>
            <身長>170</身長>
            <体重>65</体重>
        </身体データ>
    </顧客>
</顧客データ>

この文書をXML Validatorで検証してみます。

p4-3

今度は妥当性の検証も問題ありませんでした。

前のページでは説明しませんでしたが、DTD内で要素のモデルを定義するときに、特に何も記述しない場合には、その要素は、その要素の直接の親要素の中に1回しか出現できないというルールがあります。最初の例では「顧客」要素は出現回数を明確に表示していませんでしたので、「顧客」要素の親要素である「顧客データ」要素の中で2回出現したためエラーとなりました。

2つ目の例では「顧客」要素のモデルのところに「+」を追加で記述してあります。「+」は出現回数が"1回以上出現する"という意味を表す記号で、その為「顧客」要素が2回出現してもエラーとはなりませんでした。

ちなみに「顧客」要素に含まれる他の「名前」や「性別」といった要素もXML文書全体で見れば複数回出現しているのですが、それぞれの親要素(この場合はどちらも「顧客」要素)内では1回ずつしか出現していませんので問題はありません。

-- --

では出現回数の指定の方法を見ていきます。出現回数を指定する記号には下記の種類があります。

記号出現可能回数
+1回以上出現
?0回か1回出現
*0回以上出現
指定無し1回だけ出現

そして要素のモデルの右側に記号を記述します。書式は下記のようになります。

<!ELEMENT 要素名 (他の要素名記号)>
<!ELEMENT 要素名 (他の要素名1記号, 他の要素名2記号, ...)>
<!ELEMENT 要素名 (他の要素名1記号, 他の要素名2記号, ...)記号>

例えば下記のような感じです。

<!DOCTYPE 顧客データ[
  <!ELEMENT 顧客データ (顧客+)>
  <!ELEMENT 顧客 (名前+, 性別, 身体データ?)>
]>

では別のサンプルを試してみます。今までのサンプルに「趣味」という要素を追加し、この要素は0回以上出現できるように定義してみます。

sample2.xml

<?xml version="1.0" encoding="UTF-8" ?>

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