COBOL2002 XML連携機能ガイド


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属性

形式

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を入力します。