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アクセス用データ定義の名称"〕>
</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. :
上記の例の場合,次のように処理が実行されます。
-
要素「chapter1」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter1)が実行される
XMLドキュメント上の最初の選択要素が要素「chapter2」なので,XMLアクセスルーチンの戻り値には,エラーのステータス5(CBLXML-CANT-SKIP-BE)が返されます。
-
要素「chapter1」の読み込みに失敗したので,次に要素「chapter2」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter2)が実行される
要素「chapter2」の読み込みに成功します。XMLアクセスルーチンの戻り値には,正常終了のステータス0(CBLXML-OK)が返されます。
-
要素「chapter1」を読み込むXMLアクセスルーチン(CBLXML-RD-EXAMPLE-chapter1)が実行される
XMLドキュメント上の次の選択要素が要素「chapter1」なので,要素の読み込みに成功します。XMLアクセスルーチンの戻り値には,正常終了のステータス0(CBLXML-OK)が返されます。
-
要素「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. :
- (説明)
-
-
group1の下のitem1を入力します。
-
group2の下のitem1を入力します。
-