2.3.2 BaseElement要素アクセスする要素の定義

BaseElement要素は,COBOLプログラムから読み出し,および書き込みをするXML要素を指定する要素です。BaseElement要素によってCOBOLデータ項目と対応づけられたXML要素は,COBOLプログラムからXMLアクセスルーチンを使ってデータにアクセスできます。XMLアクセスルーチンの詳細については,「4.2 生成されるXMLアクセスルーチン」を参照してください。

[図データ]

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

形式
<BaseElement elemName="XML要素の名称"
cobName="XMLアクセスルーチンの名称"〕
accessInfo="yes|no"〕
nameOfBaseVar="XMLアクセス用データ定義の名称"〕>
Group要素Item要素AttrItem要素
</BaseElement>
規則
DTD中の複数の要素をBaseElement要素と対応づけた場合,対応するアクセスルーチンの呼び出し順序は,次のとおりでなくてはなりません。
(XMLドキュメントの入力および更新の場合)
BaseElement要素と対応づけた要素が実際のXMLドキュメント中に出現する順に,対応するアクセスルーチンを使用して入力(更新)してください。
(XMLドキュメントの出力の場合)
DTDで定義された順序に従った妥当なXMLドキュメントとなるように,対応するアクセスルーチンを使用して出力してください。
<この項の構成>
(1) elemName属性
(2) cobName属性
(3) accessInfo属性
(4) nameOfBaseVar属性
(5) BaseElement要素の使い方

(1) elemName属性

形式
elemName="XMLの要素名"
機能
BaseElement要素に対応づけるXMLの要素名を指定します。XMLの要素名は,BaseElement要素に対応して生成されるXMLアクセスルーチンのプログラム名の一部に使用されます。XMLアクセスルーチンの名称については,「4.2.1 XMLアクセスルーチンの名称形式」を参照してください。
規則
  • XMLの要素名称は,XMLで規定された文字で構成する必要があります。
  • XMLの要素名称とインタフェース名称の長さの和が19バイトを超える場合は,cobName属性を使って19バイト以下の名称を指定する必要があります。cobName属性を指定しないと,COBOL原始プログラムの生成時にエラーとなります。

(2) cobName属性

形式
cobName="XMLアクセスルーチンの名称"
機能
elemName属性の値の代わりにXMLアクセスルーチンのCOBOLプログラム名に使用する名称を指定します。elemName属性に指定するXML要素の名称が,COBOLプログラム名に使用できない場合などに指定します。XMLアクセスルーチンの名称については,「4.2.1 XMLアクセスルーチンの名称形式」を参照してください。
規則
  • cobName属性に指定する名称は,COBOLのプログラム名として使用できる名称である必要があります。COBOLのプログラム名として使用できない名称を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • cobName属性の名称は,19バイト以下の文字列で指定する必要があります。19バイトを超える名称を指定した場合,COBOL原始プログラムの生成時にエラーとなります。

(3) accessInfo属性

形式
accessInfo="yes|no"
機能
BaseElement要素の下位の要素で入出力データ情報定義機能を使用するかどうかを指定します。入出力データ情報定義機能については,「3. 入出力データ情報定義機能」を参照してください。
規則
  • accessInfo属性の指定を省略した場合は,Interface要素のaccessInfo属性値が仮定されます。
  • Interface要素とBaseElement要素の両方にaccessInfo属性を指定した場合,BaseElement要素のaccessInfo属性値が優先されます。
  • accessInfo属性に"yes""no"以外の値を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • accessInfo属性とemptyValue属性を同時に指定した場合,accessInfo属性の指定が優先されます。
指定例
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
 <!ELEMENT root (group01, group02)>
 <!ELEMENT group01 (item01)>
 <!ELEMENT item01  (#PCDATA)>
 <!ELEMENT group02 (item02)>
 <!ELEMENT item02  (#PCDATA)>
]>
<root/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="group01"
     accessInfo="yes">
   <Group elemName="group01">
     <Item elemName="item01" type="alphanumeric"
           size="10" />
   </Group>
 </BaseElement>
 <BaseElement elemName="group02"
     accessInfo="no">
   <Group elemName="group02">
     <Item elemName="item02" type="alphanumeric"
           size="10" />
   </Group>
 </BaseElement>
</Interface>

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

01 group01-BASE.
 02 group01.
  03 item01 PIC X(10).
* Access Information
 02 group01-FLG PIC 1(32) USAGE BIT.
 02 group01-GROUP.
  03 item01-FLG PIC 1(32) USAGE BIT.
   03 item01-LEN PIC 9(9) USAGE COMP.
01 group02.
 02 item02 PIC X(10).

(4) nameOfBaseVar属性

形式
nameOfBaseVar="XMLアクセス用データ定義の名称"
機能
入出力データ情報定義機能を使用した場合のXMLアクセス用データ定義の名称を指定します。入出力データ情報定義機能については,「3. 入出力データ情報定義機能」を参照してください。
規則
  • nameOfBaseVar属性の指定を省略した場合は,cobName属性(省略時はelemName属性)の名称に"-BASE"を追加した名称がXMLアクセス用データ定義に生成されます。
    BaseElement要素のcobName属性またはelemName属性の名称は,25文字以下で指定する必要があります。25文字を超える名称を指定した場合,COBOL原始プログラムの生成時に警告メッセージが表示されます。
  • nameOfBaseVar属性に指定する名称は,30文字以下で指定する必要があります。30文字を超える名称を指定した場合,COBOL原始プログラムの生成時に警告メッセージが表示されます。
  • nameOfBaseVar属性には,COBOLデータ項目名として使用できる名称を指定する必要があります。COBOLデータ項目名に使用できない文字を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
  • accessInfo属性の指定を省略した場合,またはaccessInfo属性に"no"を指定した場合,nameOfBaseVar属性の指定は無効となります。
    accessInfo属性の指定例については,「3.3.1(2) 指定例」を参照してください。
  • nameOfBaseVar属性には,次に示す属性とは異なる名称を指定する必要があります。同じ名称を指定した場合,COBOL原始プログラムの生成時にエラーとなります。
 nameOfBaseVar属性と異なる名称を指定する属性
  • BaseElement要素のcobName属性,nameOfBaseVar属性
  • Group要素のcobName属性,nameOfGroupVar属性
  • Item要素のcobName属性,nameOfLengthVar属性,nameOfFlagVar属性
  • Array要素のnameOfCountVar属性,nameOfTotalVar属性
  • AttrItem要素のcobName属性,nameOfLengthVar属性,nameOfFlagVar属性
注※
cobName属性の指定を省略した場合は,elemName属性になります。
指定例
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
 <!ELEMENT root (item01, item02)>
 <!ELEMENT item01  (#PCDATA)>
 <!ELEMENT item02  (#PCDATA)>
]>
<root/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="root" accessInfo="yes"
      nameOfBaseVar="BASE">
   <Group elemName="root">
     <Item elemName="item01" type="alphanumeric"
           size="10" />
     <Item elemName="item02" type="alphanumeric"
           size="10" />
   </Group>
 </BaseElement>
</Interface>

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

01 BASE.
 02 root.
  03 item01 PIC X(10).
  03 item02 PIC X(10).
* Access Information
 02 root-FLG PIC 1(32) USAGE BIT.
 02 root-GROUP.
  03 item01-FLG PIC 1(32) USAGE BIT.
  03 item01-LEN PIC 9(9) USAGE COMP.
  03 item02-FLG PIC 1(32) USAGE BIT.
  03 item02-LEN PIC 9(9) USAGE COMP.

(5) BaseElement要素の使い方

(a) 繰り返し要素をBaseElement要素に指定する

繰り返しのあるXML要素を,BaseElement要素に指定できます。

例えば,次のDTDのドキュメント構造を持つXMLドキュメントで,繰り返し要素「row」をBaseElement要素に指定できます。この場合,XML要素を読み込むアクセスルーチンを実行するたびに,要素「row」のデータが順番に読み込まれます。

(DTDの例)

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

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="row">
 <Group cobName="row">
  <Item elemName="name" cobName="FULLNAME"
        type="alphanumeric" size="30"/>
  <Item elemName="addr1" type="alphanumeric"
        size="40"/>
  <Item elemName="addr2" type="alphanumeric"
        size="40"/>
  <Item elemName="age" type="alphanumeric"
        size="3"/>
 </Group>
</BaseElement>
</Interface>

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

01 row.
02 FULLNAME PIC X(30).
02 addr1 PIC X(40).
02 addr2 PIC X(40).
02 age PIC X(3).

(XMLアクセスルーチンの呼び出し例)

 :
CALL 'CBLXML-RD-EXAMPLE-row'
   USING XML-POINTER row
   RETURNING CBLXML-RETURN-CODE.
 :

(XMLドキュメントの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<table>
 <row>
   <name>Mr. X</name>
   <address>
     <addr1>Kanagawa ken</addr1>
     <addr2>Yokohama shi</addr2>
   </address>
   <age>22</age>
 </row>
</table>

(b) 入れ子になっている繰り返し要素をBaseElement要素に指定する

繰り返し要素の親要素が,さらに繰り返し要素になっている場合でもアクセスできます。この場合,アクセスしたいXML要素をBaseElement要素に指定して,XMLアクセスルーチンを繰り返し呼び出して取得します。

例えば,次のDTDの場合,要素「sentence」をBaseElementに設定して,XMLアクセスルーチンを繰り返し呼び出すことで,要素の値を読み書きできます。

(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="sentence">
   <Item elemName="sentence" cobName="sentence1"
         type="alphanumeric" size="200"/>
 </BaseElement>
</Interface>

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

01 sentence1 PIC X(200).

また,親の繰り返し要素「paragraph」をBaseElement要素に指定し,子の繰り返し要素「sentence」をArray要素でCOBOLデータ項目に対応づける方法もあります。この場合,1回のアクセスルーチンの呼び出しで,一つの要素「paragraph」の下位にあるすべての要素「sentence」の値を読み書きできます。Array要素のmax属性には,読み書きしたい要素の最大数を指定してください。

(正しい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="sentence1"
         type="alphanumeric" size="200"/>
  </Array>
 </Group>
</BaseElement>
</Interface>

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

01 paragraph.
02 sentence1 PIC X(200) OCCURS 20.
02 NumSentences PIC 9(9) USAGE COMP.

(c) 選択要素をBaseElement要素に指定する

選択要素(複数の要素のうち,どれが出現してもよい要素)の一つをBaseElement要素に対応づける場合は,すべての選択要素をBaseElement要素に指定する必要があります。

例えば次の例の場合,選択要素の一方「chapter1」をBaseElement要素に対応づける場合は,「chapter1」「chapter2」をそれぞれBaseElement要素に指定する必要があります。

(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book [
 <!ELEMENT book (chapter1 | chapter2)*>
 <!ELEMENT chapter1 (sentence1)>
 <!ELEMENT sentence1 (#PCDATA)>
 <!ELEMENT chapter2 (sentence2)>
 <!ELEMENT sentence2 (#PCDATA)>
]>
<book/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="chapter1">
 <Group cobName="chapter1">
   <Item elemName="sentence1" type="alphanumeric"
         size="200"/>
 </Group>
</BaseElement>
<BaseElement elemName="chapter2">
 <Group cobName="chapter2">
   <Item elemName="sentence2" type="alphanumeric"
         size="200"/>
 </Group>
</BaseElement>
</Interface>

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

01 chapter1.
02 sentence1 PIC X(200).
01 chapter2.
02 sentence2 PIC X(200).

(XMLドキュメントの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<book>
 <chapter2>
   <sentence2>Mr. A</sentence2>
 </chapter2>
 <chapter1>
   <sentence1>Mr. B</sentence1>
 </chapter1>
</book>

(XMLアクセスルーチンの呼び出しの例)

 :
CALL 'CBLXML-RD-EXAMPLE-chapter1'
   USING XML-HANDLE chapter1
   RETURNING CBLXML-RETURN-CODE.
IF CBLXML-CANT-SKIP-BE THEN
CALL 'CBLXML-RD-EXAMPLE-chapter2'
   USING XML-HANDLE chapter2
   RETURNING CBLXML-RETURN-CODE
END-IF.
IF CBLXML-NO-BE-LEFT THEN
 CALL 'CBLXML-CL-EXAMPLE' USING XML-HANDLE
      RETURNING CBLXML-RETURN-CODE
END-IF.
 :

上記の例の場合,次のように処理が実行されます。
  1. 要素「chapter1」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter1)が実行される
    XMLドキュメント上の最初の選択要素が要素「chapter2」なので,XMLアクセスルーチンの戻り値には,エラーのステータス5(CBLXML-CANT-SKIP-BE)が返されます。
  2. 要素「chapter1」の読み込みに失敗したので,次に要素「chapter2」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter2)が実行される
    要素「chapter2」の読み込みに成功します。XMLアクセスルーチンの戻り値には,正常終了のステータス0(CBLXML-OK)が返されます。
  3. 要素「chapter1」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter1)が実行される
    XMLドキュメント上の次の選択要素が要素「chapter1」なので,要素の読み込みに成功します。XMLアクセスルーチンの戻り値には,正常終了のステータス0(CBLXML-OK)が返されます。
  4. 要素「chapter1」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter1)が実行される
    XMLドキュメントには,もう読み込む要素が残っていないので,要素の読み込みに失敗します。XMLアクセスルーチンの戻り値には,エラーのステータス111(CBLXML-NO-BE-LEFT)が返されます。

    [図データ]

(d) 異なる要素の下に共通にある要素

複数の異なる要素の下に共通にある要素をBaseElement要素に対応づけて,要素を入力,および更新できます。ただし,要素の出力については,動作は保証しません。

次に,異なる要素の下に共通にある要素の例を示します。

(DTDの例)

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

<!DOCTYPE root [
 <!ELEMENT root (group1 , group2 )>
 <!ELEMENT group1 (item1)>
 <!ELEMENT group2 (item1)>
 <!ELEMENT item1  (#PCDATA)>
]>
<root/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="item1">
 <Item elemName="item1" size="10"/>
</BaseElement>
</Interface>

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

01 item1 PIC X(10).

(XMLドキュメントの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<group1>
 <item1>dataa</item1>
</group1>
<group2>
 <item1>datab</item1>
</group2>
</root>

(XMLアクセスルーチンの呼び出しの例)

 :
CALL 'CBLXML-RD-EXAMPLE-item1'
   USING XML-HANDLE item1 RETURNING CBLXML-RETURN-CODE. …1.
 :
CALL 'CBLXML-RD-EXAMPLE-item1'
   USING XML-HANDLE item1 RETURNING CBLXML-RETURN-CODE. …2.
 :

(説明)
  1. group1の下のitem1を入力します。
  2. group2の下のitem1を入力します。