5.1.2 XMLドキュメントの読み込みのコーディング例
メモリ上の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.