5.1 XMLドキュメントの読み込み
XMLドキュメントからデータを読み込むには,次のような手順のCOBOLプログラムを作成します。
-
XML要素を読み込むために,cblxmlコマンドで生成されたXMLアクセス用データ定義をCOPY文で取り込む
-
CBLXML-OB-Interfaceアクセスルーチンを呼び出し,XMLドキュメントを定義しているメモリ領域を開く
-
CBLXML-RD-Interface-BaseElementアクセスルーチンを呼び出し,XML要素に対応するCOBOLデータ項目にデータを読み込む
-
読み込んだデータを処理する
-
CBLXML-CL-Interfaceアクセスルーチンを呼び出し,XMLドキュメントを閉じる
-
プログラムを終了する
(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.