BaseElement要素は,COBOLプログラムから読み出し,および書き込みをするXML要素を指定する要素です。BaseElement要素によってCOBOLデータ項目と対応づけられたXML要素は,COBOLプログラムからXMLアクセスルーチンを使ってデータにアクセスできます。XMLアクセスルーチンの詳細については,「4.2 生成されるXMLアクセスルーチン」を参照してください。
BaseElement要素は,子要素としてGroup要素,Item要素,またはAttrItem要素のどれか一つを持ちます。
<?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/>
<?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>
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).
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
<!ELEMENT root (item01, item02)>
<!ELEMENT item01 (#PCDATA)>
<!ELEMENT item02 (#PCDATA)>
]>
<root/>
<?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>
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.
繰り返しのあるXML要素を,BaseElement要素に指定できます。
例えば,次のDTDのドキュメント構造を持つXMLドキュメントで,繰り返し要素「row」をBaseElement要素に指定できます。この場合,XML要素を読み込むアクセスルーチンを実行するたびに,要素「row」のデータが順番に読み込まれます。
<?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/>
<?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>
01 row.
02 FULLNAME PIC X(30).
02 addr1 PIC X(40).
02 addr2 PIC X(40).
02 age PIC X(3).
:
CALL 'CBLXML-RD-EXAMPLE-row'
USING XML-POINTER row
RETURNING CBLXML-RETURN-CODE.
:
<?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>
繰り返し要素の親要素が,さらに繰り返し要素になっている場合でもアクセスできます。この場合,アクセスしたいXML要素をBaseElement要素に指定して,XMLアクセスルーチンを繰り返し呼び出して取得します。
例えば,次のDTDの場合,要素「sentence」をBaseElementに設定して,XMLアクセスルーチンを繰り返し呼び出すことで,要素の値を読み書きできます。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book [
<!ELEMENT book (chapter)*>
<!ELEMENT chapter (paragraph)*>
<!ELEMENT paragraph (sentence)*>
<!ELEMENT sentence (#PCDATA)>
]>
<book/>
<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="sentence">
<Item elemName="sentence" cobName="sentence1"
type="alphanumeric" size="200"/>
</BaseElement>
</Interface>
01 sentence1 PIC X(200).
また,親の繰り返し要素「paragraph」をBaseElement要素に指定し,子の繰り返し要素「sentence」をArray要素でCOBOLデータ項目に対応づける方法もあります。この場合,1回のアクセスルーチンの呼び出しで,一つの要素「paragraph」の下位にあるすべての要素「sentence」の値を読み書きできます。Array要素のmax属性には,読み書きしたい要素の最大数を指定してください。
<?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>
01 paragraph.
02 sentence1 PIC X(200) OCCURS 20.
02 NumSentences PIC 9(9) USAGE COMP.
選択要素(複数の要素のうち,どれが出現してもよい要素)の一つをBaseElement要素に対応づける場合は,すべての選択要素をBaseElement要素に指定する必要があります。
例えば次の例の場合,選択要素の一方「chapter1」をBaseElement要素に対応づける場合は,「chapter1」「chapter2」をそれぞれBaseElement要素に指定する必要があります。
<?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/>
<?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>
01 chapter1.
02 sentence1 PIC X(200).
01 chapter2.
02 sentence2 PIC X(200).
<?xml version="1.0" encoding="Shift_JIS"?>
<book>
<chapter2>
<sentence2>Mr. A</sentence2>
</chapter2>
<chapter1>
<sentence1>Mr. B</sentence1>
</chapter1>
</book>
:
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.
:
複数の異なる要素の下に共通にある要素をBaseElement要素に対応づけて,要素を入力,および更新できます。ただし,要素の出力については,動作は保証しません。
次に,異なる要素の下に共通にある要素の例を示します。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
<!ELEMENT root (group1 , group2 )>
<!ELEMENT group1 (item1)>
<!ELEMENT group2 (item1)>
<!ELEMENT item1 (#PCDATA)>
]>
<root/>
<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="item1">
<Item elemName="item1" size="10"/>
</BaseElement>
</Interface>
01 item1 PIC X(10).
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<group1>
<item1>dataa</item1>
</group1>
<group2>
<item1>datab</item1>
</group2>
</root>
:
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.
: