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.