Hitachi

COBOL2002 XML連携機能ガイド


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.