「IDENTIFIED BY および IS ATTRIBUTE 句」セクションで示したように、出現回数が特定されない既知のタグや不明なタグにも、XML 用に拡張された各種の動詞を通じて対処することが可能です。一方、それほど複雑ではなく、出現回数があらかじめ分かっている場合には、非常に簡単な構文拡張で直接割り当てを行うことができます。
出現回数が分かっているタグや属性には、OCCURS 句や COUNT IN 句を使用します。OCCURS 句では、タグや属性の出現回数の許容上限を指定します。COUNT IN 句では、受信回数を特定したり、送信回数を指定したりできます。
COUNT IN 句の例を次に示します。
0010 $set preprocess(prexml) warn endp 0020 $set sourceformat(free) case 0030 0040 select library-file 0050 assign address of mybuf 0060 organization is xml 0070 document-type is "library.xsd" 0080 file status is library-status. 0090 0100 data division. 0110 0120 xd library-file. 0130 01 library identified by "library". 0140 05 book identified by "book" 0150 occurs 10 times 0160 count in library-book-count. 0170 10 book-title pic x(80) identified by "title". 0180 10 book-author pic x(80) identified by "author". 0190 10 book-toc identified by "toc". 0200 15 book-toc-section occurs 20 times 0210 count in book-section-count 0220 identified by "section" 0230 pic x(20). 0240 0250 working-storage section. 0260 01 library-status pic s999. 0270 01 mybuf. 0280 10 pic x(150) value 0290 '<library>' 0300 & '<book><title>book1</title>' 0310 &' <toc><section>b1section1</section>' 0320 & ' <section>b1section2</section>' 0330 & '</toc></book>'. 0340 10 pic x(150) value 0350 '<book><title>book2</title>' 0360 & ' <toc><section>b2section1</section>' 0370 & ' <section>b2section2</section>' 0380 & '</toc></book>' 0390 & '</library>'. 0400 0410 open input library-file 0420 read library-file 0430 perform until library-book-count = 0 0440 display 0450 "Book title = '" book-title(library-book-count) "'" 0460 display "Number of Sects = " 0470 book-section-count(library-book-count) 0480 subtract 1 from library-book-count 0490 end-perform 0500 close library-file 0510 stop run.
0040 ~ 0080 行目:
0040 select library-file 0050 assign address of mybuf 0060 organization is xml 0070 document-type is "library.xsd" 0080 file status is library-status.
XML 入力のソースとしてファイル名とバッファー (mybuf) を割り当て、ファイル編成 (XML)、XML スキーマ名を指定するファイル名 (library.xsd)、およびファイル状態を示すデータ名を指定しています。
0120 ~ 0230 行目:
0120 xd library-file. 0130 01 library identified by "library". 0140 05 book identified by "book" 0150 occurs 10 times 0160 count in library-book-count. 0170 10 book-title pic x(80) identified by "title". 0180 10 book-author pic x(80) identified by "author". 0190 10 book-toc identified by "toc". 0200 15 book-toc-section occurs 20 times 0210 count in book-section-count 0220 identified by "section" 0230 pic x(20).
バッファー領域のレコード構造を設定しています。OCCURS および COUNT-IN の使用法に注目してください。この例では、データ名 book は XML タグ <book> で識別され、出現回数は 10 回、暗黙的に定義されている library-book-count フィールドで出現がカウントされます。book-toc-section データ項目も同様に定義されており、暗黙的に定義されている book-section-count でカウントされます。
0270 ~ 0390 行目:
0270 01 mybuf. 0280 10 pic x(150) value 0290 '<library>' 0300 & '<book><title>book1</title>' 0310 &' <toc><section>b1section1</section>' 0320 & ' <section>b1section2</section>' 0330 & '</toc></book>'. 0340 10 pic x(150) value 0350 '<book><title>book2</title>' 0360 & ' <toc><section>b2section1</section>' 0370 & ' <section>b2section2</section>' 0380 & '</toc></book>' 0390 & '</library>'.
静的バッファーに読み取る XML ストリームを指定しています。このプログラムでは XML ストリームをコード内で指定していますが、標準入力を使用して XML をバッファー (mybuf) に格納することもできます。
0430 ~ 0490 行目:
0430 perform until library-book-count = 0 0440 display 0450 "Book title = '" book-title(library-book-count) "'" 0460 display "Number of Sects = " 0470 book-section-count(library-book-count) 0480 subtract 1 from library-book-count 0490 end-perform
すべてのレコードにわたってループし、レコード内に含まれるすべての書籍のタイトルとセクション数をレコードごとに表示します。book-section-count の指標として library-book-count を使用している点に注意してください。
COUNT IN 句は、要素定義に関連するタグが XML ストリームに含まれているかどうかを判定する手段としても非常に役立ちます。たとえば、一連の XD レコードのうち、READ 文の実行中に読み取られるレコードを特定する手段として、きわめて一般的に使用されます。次に例を示します。
0010 select book-or-author-file 0020 assign address of mybuf 0030 organization is xml 0040 document-type is "bookdb.xsd" 0050 file status is xml-bookdb-status. 0060 0070 data division. 0080 xd book-or-author-file. 0090 01 book-rec identified by "book" 0100 count in book-count. 0110 05 price-val pic 999.99 identified by "price" 0120 is attribute 0130 count in price-count. 0140 05 title-val pic x(80) identified by "title". 0150 0160 01 author-rec identified by "author" 0170 count in author-count. 0180 05 author-val pic x(80). 0190 0200 working-storage section. 0210 01 xml-bookdb-status pic s999. 0220 01 mybuf pic x(256) value 0230 '<book price="123.00"><title>A title</title></book>'. 0240 0250 procedure division. 0260 open input book-or-author-file 0270 read book-or-author-file 0280 evaluate true 0290 when book-count = 1 0300 if price-count not = 0 0310 display "got <book price=" price-val "> 0320 <title>" title-val "</title></book>" 0330 else 0340 display "got <book><title>" title-val 0350 "</title></book>" 0360 end-if 0370 when author-count = 1 0380 display "got <author>" author-val "</author>" 0390 end-evaluate 0400 close book-or-author-file 0410 stop run.
0010 ~ 0050 行目:
0010 select book-or-author-file 0020 assign address of mybuf 0030 organization is xml 0040 document-type is "bookdb.xsd" 0050 file status is xml-bookdb-status.
XML 入力のソースとしてファイル名とバッファー (mybuf) を割り当て、ファイル編成 (XML)、XML スキーマ名を指定するファイル名 (bookdb.xsd)、およびファイル状態を示すデータ名を指定しています。
0080 ~ 0180 行目:
0080 xd book-or-author-file. 0090 01 book-rec identified by "book" 0100 count in book-count. 0110 05 price-val pic 999.99 identified by "price" 0120 is attribute 0130 count in price-count. 0140 05 title-val pic x(80) identified by "title". 0150 0160 01 author-rec identified by "author" 0170 count in author-count. 0180 05 author-val pic x(80).
01 レベルの項目を 2 つ定義しています。1 つは書籍レコード (book-rec)、もう 1 つは著作者レコード (author-rec) です。COUNT IN で定義した情報は、読み取られているレコードを特定するときに使用します。
0220 ~ 0230 行目:
静的バッファーに読み取る XML ストリームを指定しています。このプログラムでは XML ストリームをコード内で指定していますが、標準入力を使用して XML をバッファー (mybuf) に格納することもできます。
0260 ~ 0390 行目:
0260 open input book-or-author-file 0270 read book-or-author-file 0280 evaluate true 0290 when book-count = 1 0300 if price-count not = 0 0310 display "got <book price=" price-val "> 0320 <title>" title-val "</title></book>" 0330 else 0340 display "got <book><title>" title-val 0350 "</title></book>" 0360 end-if 0370 when author-count = 1 0380 display "got <author>" author-val "</author>" 0390 end-evaluate
EVALUATE 句によって、book-count または author-count の値を基に、読み取られているレコードが特定されます。