2.3.5 Array要素繰り返し要素の定義

Array要素は,繰り返し要素OCCURS句を持つCOBOLデータ項目に対応づける要素です。

[図データ]

Array要素は,子要素としてGroup要素,Item要素,またはAttrItem要素のどれかを持ちます。

形式
<Array max="要素の最大繰り返し回数"
nameOfCountVar="繰り返し入出力数の名称"〕
nameOfTotalVar="繰り返し全要素数の名称"〕
countVar="yes|no"〕>
Group要素Item要素AttrItem要素
</Array>
指定例
Array要素を使って,繰り返し要素「sentence」をCOBOLのOCCURS句付きのデータ項目「a-sentence」に対応づける例を次に示します。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book [
 <!ELEMENT book (chapter)*>
 <!ELEMENT chapter (paragraph)*>
 <!ELEMENT paragraph (sentence)*>
 <!ELEMENT sentence (#PCDATA)>
]>
<book/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
  <BaseElement elemName="paragraph">
    <Group cobName="paragraph">
      <Array max="20">
        <Item elemName="sentence"
              cobName="a-sentence"
              type="alphanumeric"
              size="1000"/>
      </Array>
    </Group>
  </BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 paragraph.
02 a-sentence PIC X(1000) OCCURS 20.
02 a-sentence-COUNT PIC 9(9) USAGE COMP.

<この項の構成>
(1) max属性
(2) nameOfCountVar属性
(3) nameOfTotalVar属性
(4) countVar属性

(1) max属性

形式
max="配列の最大要素数"
機能
要素の繰り返し回数の最大値を指定します。
規則
  • max属性に指定できる値は,1~16,777,215の範囲です。この範囲を超える値を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • 読み込もうとしたXML要素の数が,Array要素のmax属性に指定した値よりも小さい場合,余ったCOBOLデータ項目(XMLドキュメントから値を入力しなかったデータ項目)は表 2-10に示す値になります。

    表2-10 余ったCOBOLデータ項目の値

    Array要素のに対するcountVar属性の指定余ったCOBOLデータ項目の値
    countVar="yes"またはcountVarを指定していない不定となる
    countVar="no"emptyValue属性値を設定する
  • 読み込もうとしたXML要素の数が,max属性に指定した値よりも大きい場合,最大値を超えた部分のデータは,COBOLデータ項目に読み込まれません。
(例)
max属性に指定した値と,XMLドキュメント中の要素の数による動作の違いを次に示します。
[図データ]

(2) nameOfCountVar属性

形式
nameOfCountVar="繰り返し入出力数の名称"
機能
Array要素に対応した繰り返し項目の入出力数を扱うための繰り返し入出力数の名称を指定します。XMLドキュメント入力時には,繰り返し項目の入力した数が設定されます。XMLドキュメント出力時には,出力する繰り返し項目の数を設定できます。
Interface要素とBaseElement要素のaccessInfo属性に"no"を指定した場合,要素の繰り返し入出力数を格納するCOBOLデータ項目は繰り返し項目と同じレベルに生成されます。accessInfo属性に"yes"を指定した場合,入出力データ情報項目の中に生成されます。
規則
  • nameOfCountVar属性の指定を省略した場合は,Array要素の直下に含まれるItem要素またはGroup要素のcobName属性(省略時はelemName属性)の名称に"-COUNT"を追加した名称がXMLアクセス用データ定義に生成されます。
    cobName属性(省略時はelemName属性)の名称は,24文字以下で指定する必要があります。24文字を超える名称を指定した場合,COBOL原始プログラムの生成時に警告メッセージが表示されます。
  • nameOfCountVar属性に指定する名称は,30文字以下で指定する必要があります。30文字を超える名称を指定した場合,COBOL原始プログラムの生成時に警告メッセージが表示されます。
  • nameOfCountVar属性には,COBOLデータ項目名に使用できる名称を指定する必要があります。COBOLデータ項目名として使用できない名称を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • nameOfCountVar属性には,次に示す属性とは異なる名称を指定する必要があります。同じ名称を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
 nameOfCountVar属性と異なる名称を指定する属性
  • BaseElement要素のcobName属性,nameOfBaseVar属性
  • Group要素のcobName属性,nameOfGroupVar属性
  • Item要素のcobName属性,nameOfLengthVar属性,nameOfFlagVar属性
  • Array要素のnameOfCountVar属性,nameOfTotalVar属性
  • AttrItem要素のcobName属性,nameOfLengthVar属性,nameOfFlagVar属性
注※
cobName属性の指定を省略した場合は,elemName属性になります。
指定例1
Array要素に含まれるGroup要素がelemName属性を持つ場合の指定例を次に示します。入力時にnameOfCountVar属性で指定したCOBOLデータ項目の値は,elemName属性で指定した要素の繰り返し回数となります。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE table1 [
<!ELEMENT table1 (row)*>
<!ELEMENT row (item1?,item2?)>
<!ELEMENT item1 (#PCDATA)>
<!ELEMENT item2 (#PCDATA)>
]>
<table1/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="table1">
   <Group cobName="table1">
     <Array max="100">
       <Group elemName="row">
         <Item elemName="item1"
               type="alphanumeric" size="10"/>
         <Item elemName="item2"
               type="alphanumeric" size="10"/>
       </Group>
     </Array>
   </Group>
 </BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 table1.
02 row OCCURS 100.
 03 item1 PIC X(10).
 03 item2 PIC X(10).
02 row-COUNT PIC 9(9) USAGE COMP.

(入力するXMLドキュメント)

<?xml version="1.0" encoding="Shift_JIS"?>
<table1>
 <row>
   <item2/>
 </row>
 <row>
 </row>
 <row>
   <item1/>
 </row>
</table1>

この場合,Array要素に含まれるGroup要素のelemName属性に要素rowを指定しているので,row-COUNTの値はrow要素の出現回数である3になります。
指定例2
Array要素に含まれるGroup要素がelemName属性を持たない場合の指定例を次に示します。入力時のnameOfCountVar属性で指定したCOBOLデータ項目の値は,集団項目への要素の入力の繰り返し回数となります。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE table1 [
<!ELEMENT table1 (row)*>
<!ELEMENT row (item1?,item2?)>
<!ELEMENT item1 (#PCDATA)>
<!ELEMENT item2 (#PCDATA)>
]>
<table1/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="table1">
   <Group cobName="table1">
     <Array max="100">
       <Group cobName="row">
         <Item elemName="item1"
               type="alphanumeric" size="10"/>
         <Item elemName="item2"
               type="alphanumeric" size="10"/>
       </Group>
     </Array>
   </Group>
 </BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 table1.
02 row OCCURS 100.
 03 item1 PIC X(10).
 03 item2 PIC X(10).
02 row-COUNT PIC 9(9) USAGE COMP.

(入力するXMLドキュメント)

<?xml version="1.0" encoding="Shift_JIS"?>
<table1>
 <row>
   <item2/>
 </row>
 <row>
 </row>
 <row>
   <item1/>
 </row>
</table1>

この場合,Array要素に含まれるGroup要素がelemName属性を持たないので,集団項目への要素の入力の繰り返し回数がrow-COUNTの値となります。また,2番目のrow要素には要素が含まれないため,この要素は繰り返し回数には含まれません。
要素の入力は,DDFに記述した順序で行われます。この例の場合,要素「item2」を入力した時点で1回目の繰り返しが終了し,要素「item1」を入力した時点で繰り返しが2回となるため,row-COUNTの値は2となります。
指定例3
要素「sentence」の読み込み,または書き込みを繰り返した回数を格納するCOBOLデータ項目の名称を「NumSentences」に指定する例を次に示します。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book [
 <!ELEMENT book (chapter)*>
 <!ELEMENT chapter (paragraph)*>
 <!ELEMENT paragraph (sentence)*>
 <!ELEMENT sentence (#PCDATA)>
]>
<book/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
  <BaseElement elemName="paragraph">
    <Group cobName="paragraph">
      <Array max="20"
             nameOfCountVar="NumSentences">
        <Item elemName="sentence"
              cobName="a-sentence"
              type="alphanumeric"
              size="1000"/>
      </Array>
    </Group>
  </BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 paragraph.
 02 a-sentence PIC X(1000) OCCURS 20.
 02 NumSentences PIC 9(9) USAGE COMP.

指定例4
Array要素の内側のGroup要素にelemName属性が指定されていない場合,入力数を表すデータ項目の値(繰り返し入出力数)は,集団項目へ要素を入力する繰り返し回数となります。例えば,次のようなDTDで要素「item1」を対応づけていない場合,group1要素だけが集団項目に入力されます。その結果,内側のArray要素に対応する繰り返しはオーバフローし,grp0-COUNTの値は1,group1-COUNT(1)の値は4となります。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
 <!ELEMENT root ((group1*, item1)*)>
 <!ELEMENT group1 (item2?)>
 <!ELEMENT item1 (#PCDATA)>
 <!ELEMENT item2 (#PCDATA)>
]>
<root/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="root" cobName="BE">
<Group elemName="root">
<Array max="4">
 <Group cobName="grp0">
   <Array max="4">
   <Group elemName="group1">
     <Item elemName="item2"/>
   </Group>
   </Array>
 </Group>
</Array>
</Group>
</BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 root.
02 grp0 OCCURS 4.
 03 group1 OCCURS 4.
  04 item2 PIC X(100).
 03 group1-COUNT PIC 9(9) USAGE COMP.
02 grp0-COUNT PIC 9(9) USAGE COMP.

(入力するXMLドキュメント)

<?xml version="1.0" encoding="Shift_JIS"?>
<root>
 <group1> <item2>item2a1</item2> </group1>
 <group1> <item2>item2a2</item2> </group1>
 <group1> <item2>item2a3</item2> </group1>
 <group1> <item2>item2a4</item2> </group1>
 <item1/>
 <group1> <item2>item2b1</item2> </group1>
 <group1> <item2>item2b2</item2> </group1>
 <group1> <item2>item2b3</item2> </group1>
 <group1> <item2>item2b4</item2> </group1>
 <item1/>
</root>

入出力データ情報定義機能を使用した場合のnameOfCountVar属性の指定例については,「3.2.4(1) nameOfTotalVar属性とnameOfCountVar属性の指定例」を参照してください。

(3) nameOfTotalVar属性

形式
nameOfTotalVar="繰り返し全要素数の名称"
機能
Interface要素またはBaseElement要素のaccessInfo属性に"yes"を指定した場合に,繰り返し全要素数の名称を指定します。
繰り返し全要素数には,Array要素に対応づけたXMLドキュメント内の繰り返し要素の繰り返し回数が格納されます。
規則
  • nameOfTotalVar属性の指定を省略した場合は,cobName属性(省略時はelemName属性)の名称に"-TOTAL"を追加した名称がXMLアクセス用データ定義に生成されます。
    cobName属性(省略時はelemName属性)の名称は,24文字以下で指定する必要があります。24文字を超える名称を指定した場合,COBOL原始プログラムの生成時に警告メッセージが表示されます。
  • nameOfTotalVar属性に指定する名称は,30文字以下で指定する必要があります。30文字を超える名称を指定した場合,COBOL原始プログラムの生成時に警告メッセージが表示されます。
  • nameOfTotalVar属性には,COBOLデータ項目名として使用できる名称を指定する必要があります。COBOLデータ項目名に使用できない文字を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • accessInfo属性に指定がない場合,またはaccessInfo属性に"no"を指定した場合,nameOfTotalVar属性の指定は無効となります。
    accessInfo属性の指定例については,「3.3.4 Array要素」を参照してください。
  • nameOfTotalVar属性と,次に示す属性とは異なる名称を指定する必要があります。同じ名称を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
 nameOfTotalVar属性と異なる名称を指定する属性
  • BaseElement要素のcobName属性,nameOfBaseVar属性
  • Group要素のcobName属性,nameOfGroupVar属性
  • Item要素のcobName属性,nameOfLengthVar属性,nameOfFlagVar属性
  • Array要素のnameOfCountVar属性,nameOfTotalVar属性
  • AttrItem要素のcobName属性,nameOfLengthVar属性,nameOfFlagVar属性
注※
cobName属性の指定を省略した場合は,elemName属性になります。

入出力データ情報定義機能を使用した場合のnameOfTotalVar属性の指定例については,「3.2.4(1) nameOfTotalVar属性とnameOfCountVar属性の指定例」を参照してください。

(4) countVar属性

形式
countVar="yes|no"
機能
繰り返し入出力数に対応するCOBOLデータ項目を出力するかどうかを指定します。
countVar属性に"yes"を指定した場合,繰り返し入出力数を示すデータ項目がXMLアクセス用データ定義に生成されます。countVar属性に"no"を指定した場合,繰り返し入出力数を示すデータ項目は生成されません。
規則
  • countVar属性の指定を省略した場合は,"yes"が仮定されます。
  • countVar属性に"yes""no"以外の値を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • countVar属性に"yes"を指定した場合,Array要素の直下にあるItem要素のemptyValue属性は無効となります。
  • countVar属性に"no"を指定した「+」付きの繰り返し要素で全要素を出力しない場合,CBLXML-WR-Interface-BaseElementアクセスルーチンでステータス7は返りません。
  • countVar属性に"no"を指定した場合,繰り返し要素の特定の要素を出力するかどうかを決定する規則を次に示します。
Array要素の内側にItem要素がある場合(accessInfo="no"指定時)
繰り返し項目の要素に含まれる項目がemptyValue属性で指定した値に等しければ,その要素は出力されません。
Array要素の内側にItem要素がある場合(accessInfo="yes"指定時)
アクセス情報フラグにCBLXML-FLAG-MISSINGを指定すると,その要素は出力されません。
アクセス情報フラグの設定についての詳細については,「3.6 XMLドキュメント書き込み時に設定する入出力データ情報項目」を参照してください。
Array要素の内側にGroup要素がある場合
Array要素の内側にあるGroup要素が出力されなければ,繰り返し要素の特定の要素は出力されません。
指定例1
countVar属性に"no"を指定したArray要素の内側にItem要素がある場合の例を次に示します。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book [
 <!ELEMENT book (chapter)*>
 <!ELEMENT chapter (paragraph)*>
 <!ELEMENT paragraph (sentence)*>
 <!ELEMENT sentence (#PCDATA)>
]>
<book/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
  <BaseElement elemName="paragraph">
    <Group cobName="paragraph">
      <Array max="5" countVar="no">
        <Item elemName="sentence"
       cobName="a-sentence" type="alphanumeric"
       size="100" emptyValue="SPACE"/>
      </Array>
    </Group>
  </BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 paragraph.
02 a-sentence PIC X(100) OCCURS 5.

(COBOLデータ項目の値)

MOVE "This is sentence 1." TO a-sentence(1).
MOVE SPACE TO a-sentence(2).
MOVE "This is sentence 3." TO a-sentence(3).
MOVE SPACE TO a-sentence(4).
MOVE SPACE TO a-sentence(5).

(出力ドキュメント)

<?xml version="1.0" encoding="Shift_JIS"?>

<book>
<chapter>
<paragraph>
<sentence>This is sentence 1.</sentence>
<sentence>This is sentence 3.</sentence>
</paragraph>
</chapter>
</book>

指定例2
countVar属性に"no"を指定したArray要素の内側にGroup要素がある場合の例を次に示します。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE table [
<!ELEMENT table (person)*>
<!ELEMENT person (name?,address?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
]>
<table/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="table">
   <Group cobName="table1">
     <Array max="3" countVar="no">
       <Group elemName="person">
         <Item elemName="name" cobName="name1"
         emptyValue="SPACE"/>
         <Item elemName="address"
         cobName="address1" emptyValue="SPACE"/>
       </Group>
     </Array>
   </Group>
 </BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 table1.
02 person OCCURS 3.
 03 name1 PIC X(100).
 03 address1 PIC X(100).

(COBOLデータ項目の値)

         MOVE 'name-1' TO name1(1).
         MOVE 'address-1' TO address1(1).
         MOVE SPACE TO name1(2).
         MOVE SPACE TO address1(2).
         MOVE 'name-3' TO name1(3).
         MOVE SPACE TO address1(3).

(出力ドキュメント)

<?xml version="1.0" encoding="Shift_JIS"?>
<table>
 <person>
   <name>name-1</name>
   <address>address-1</address>
 </person>
 <person>
   <name>name-3</name>
 </person>
</table>