COBOL2002 XML連携機能ガイド


5.1 XMLドキュメントの読み込み

XMLドキュメントからデータを読み込むには,次のような手順のCOBOLプログラムを作成します。

  1. XML要素を読み込むために,cblxmlコマンドで生成されたXMLアクセス用データ定義をCOPY文で取り込む

  2. CBLXML-OB-Interfaceアクセスルーチンを呼び出し,XMLドキュメントを定義しているメモリ領域を開く

  3. CBLXML-RD-Interface-BaseElementアクセスルーチンを呼び出し,XML要素に対応するCOBOLデータ項目にデータを読み込む

  4. 読み込んだデータを処理する

  5. CBLXML-CL-Interfaceアクセスルーチンを呼び出し,XMLドキュメントを閉じる

  6. プログラムを終了する

(a) DTD,DDFの例

次に示すコーディング例が対象とするDTD,DDF,およびXMLアクセス用データ定義の例です。

(DTDの例)
<?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/>
(DDFの例)
<?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>
(生成されるCOBOLのデータ項目)
01 row.
 02 full-name PIC X(20).
 02 age PIC 9(3).
 02 city PIC X(30).

(b) 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.