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.