XMLドキュメントからデータを読み込むには,次のような手順のCOBOLプログラムを作成します。
次に示すコーディング例が対象とするDTD,DDF,およびXMLアクセス用データ定義の例です。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE table [
<!ELEMENT table (row)*>
<!ELEMENT row (name, address, grade, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (addr1, addr2, city, state,
postcode)>
<!ELEMENT addr1 (#PCDATA)>
<!ELEMENT addr2 (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postcode (#PCDATA)>
<!ELEMENT grade (#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="full-name"
type="alphanumeric" size="20"/>
<Item elemName="age" type="numeric" size="3"/>
<Item elemName="city" type="alphanumeric"
size="30"/>
</Group>
</BaseElement>
</Interface>
01 row.
02 full-name PIC X(20).
02 age PIC 9(3).
02 city PIC X(30).
メモリ上のXMLドキュメントからデータを読み込むプログラムのコーディング例を,次に示します。この例では,テスト用にXML要素を定義したメモリ空間をバッファに作成しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. READSAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY 'subprog-COPY.cbl'.
01 XML-POINTER USAGE POINTER.
01 XML-ERROR-CODE PIC 9(9) USAGE COMP VALUE 0.
01 BUFFER-MODE PIC X(16).
01 BUFFER-LENGTH PIC 9(9) COMP VALUE 284.
01 BUFFER USAGE POINTER VALUE NULL.
* テストデータ
01 TEST-DATA.
02 TEST-DATA1 PIC X(147) VALUE
'<?xml version="1.0" encoding="Shift_JIS"?><table>
-'<!--typical values--><row><name>John Smith</name>
-'<age>20</age><city>Irvine</city></row><row>
-'<name>'.
02 TEST-DATA2 PIC X(137) VALUE
'Jane Doe</name><age>30</age><city>Los Angeles
-'</city></row><row><name>Tim Johnson</name><age>100
-'</age><city>San Diego</city></row></table>'.
PROCEDURE DIVISION.
* プログラム開始
DISPLAY ' COBOL Data Types - Buffer READ'.
* テストデータ
COMPUTE BUFFER = FUNCTION ADDR(TEST-DATA).
* XMLドキュメントを入力するための
* オープンモードを'READ'に設定
MOVE 'R' TO BUFFER-MODE.
* XMLドキュメントを開く
PERFORM OPEN-BUFFER.
DISPLAY ' ***** Read 1st Row *****'.
* row要素の値をXMLドキュメントから入力する
PERFORM READ-BUFFER.
* 入力値を確認する
IF FULL-NAME NOT EQUAL TO 'John Smith' THEN
DISPLAY 'ERROR! - FULL-NAME: ' FULL-NAME
ELSE
DISPLAY FULL-NAME
END-IF.
IF AGE NOT EQUAL TO 20 THEN
DISPLAY 'ERROR! - age: ' AGE
ELSE
DISPLAY AGE
END-IF.
IF CITY NOT EQUAL TO 'Irvine' THEN
DISPLAY 'ERROR! - city: ' CITY
ELSE
DISPLAY CITY
END-IF.
DISPLAY ' ***** Read 2nd ROW *****'.
* row要素の値をXMLドキュメントから入力する
PERFORM READ-BUFFER.
* 入力値を確認する
IF FULL-NAME NOT EQUAL TO 'Jane Doe' THEN
DISPLAY 'ERROR! - FULL-NAME: ' FULL-NAME
ELSE
DISPLAY FULL-NAME
END-IF.
IF AGE NOT EQUAL TO 30 THEN
DISPLAY 'ERROR! - age: ' AGE
ELSE
DISPLAY AGE
END-IF.
IF CITY NOT EQUAL TO 'Los Angeles' THEN
DISPLAY 'ERROR! - city: ' CITY
ELSE
DISPLAY CITY
END-IF.
DISPLAY ' ***** Read 3rd ROW *****'.
* row要素の値をXMLドキュメントから入力する
PERFORM READ-BUFFER.
* 入力値を確認する
IF FULL-NAME NOT EQUAL TO 'Tim Johnson' THEN
DISPLAY 'ERROR! - FULL-NAME: ' FULL-NAME
ELSE
DISPLAY FULL-NAME
END-IF.
IF AGE NOT EQUAL TO 100 THEN
DISPLAY 'ERROR! - age: ' AGE
ELSE
DISPLAY AGE
END-IF.
IF CITY NOT EQUAL TO 'San Diego' THEN
DISPLAY 'ERROR! - city: ' CITY
ELSE
DISPLAY CITY
END-IF.
* XMLドキュメントを閉じる
PERFORM CLOSE-BUFFER.
* プログラム終了
STOP RUN.
* XMLアクセスルーチン(メモリ空間を開く)
OPEN-BUFFER.
CALL 'CBLXML-OB-EXAMPLE'
USING BUFFER BUFFER-LENGTH
BUFFER-MODE XML-POINTER
RETURNING XML-ERROR-CODE.
IF XML-ERROR-CODE NOT EQUAL 0
MOVE XML-ERROR-CODE TO RETURN-CODE
DISPLAY
'Failed to open XML document (open) - Error '
XML-ERROR-CODE
GO TO ENDOFPROGRAM
END-IF.
* XMLアクセスルーチン(入力)
READ-BUFFER.
CALL 'CBLXML-RD-EXAMPLE-row'
USING XML-POINTER ROW
RETURNING XML-ERROR-CODE.
IF XML-ERROR-CODE NOT EQUAL 0
MOVE XML-ERROR-CODE TO RETURN-CODE
DISPLAY
'Failed to read XML document - Error '
XML-ERROR-CODE
GO TO ENDOFPROGRAM
END-IF.
* XMLアクセスルーチン(閉じる)
CLOSE-BUFFER.
CALL 'CBLXML-CL-EXAMPLE'
USING XML-POINTER
RETURNING XML-ERROR-CODE.
IF XML-ERROR-CODE NOT EQUAL 0
MOVE XML-ERROR-CODE TO RETURN-CODE
DISPLAY
'Failed to close XML document - Error '
XML-ERROR-CODE
GO TO ENDOFPROGRAM
END-IF.
ENDOFPROGRAM.
STOP RUN.
END PROGRAM READSAMPLE.