9.3.4 次に入力するBaseElement要素の位置を取得する機能

CBLXML-GET-NEXT-BEサービスルーチンは,入力または更新モードで開いたXMLドキュメントに対し,次に入力するBaseElement要素のXMLドキュメント上での位置情報を取得できます。位置情報は"/"文字を区切り文字としての階層で,ルート要素からBaseElement要素までを設定します。BaseElement要素が繰り返しである場合,繰り返し順序を示す"[番号]"が要素に付け加えられます。DTDで"*"または"+"によって繰り返しがあることが指定されている要素でも,XMLドキュメント中に1回しか現れない要素については,繰り返し順序を示す"[番号]"は付け加えられません。番号は1から開始し,2,147,483,647までです。番号の範囲を超えた場合は,保証しません。

(位置情報の例)

/ルート要素/要素/BaseElement要素[番号]

形式
CALL 'CBLXML-GET-NEXT-BE' USING XML-POINTER BE-LOCALE-BUFFER BE-LOCALE-BUFFER-LENGTH BE-LOCALE-LENGTH.
引数
引数のデータ型指定説明
01 XML-POINTER USAGE POINTER.XMLドキュメントのポインタを受け取るポインタ項目を指定する。
01 BE-LOCALE-BUFFER PIC X(n).BaseElement要素の位置情報を受け取る領域を英数字項目で指定する。
01 BE-LOCALE-BUFFER-LENGTH PIC 9(9) COMP.BaseElement要素の位置情報を受け取る領域の長さを4バイトの二進項目で指定する。
01 BE-LOCALE-LENGTH PIC 9(9) COMP.受け取った位置情報の長さが設定される。この項目は4バイトの二進項目で指定する。
(凡例)
○:サービスルーチンの呼び出し時,値を設定しておく項目
△:サービスルーチンの完了時,値が設定される項目
戻り値
戻り値内容
3次に入力するBaseElement要素がない。
2XMLドキュメントを開いていない状態で位置情報を取得した。または出力モードで開いたXMLドキュメントの位置情報を取得した。
1BaseElement要素の位置情報の長さが位置情報を受け取る領域の長さを超えた。
0正常終了した。
-1CBLXML-GET-NEXT-BEサービスルーチンの引数の値が不正。
-2操作を続けるためのメモリが不足した。
戻り値は,RETURN-CODE特殊レジスタに設定されます。
規則
  • BE-LOCALE-BUFFER-LENGTHに指定した長さより,受け取るBaseElement要素の位置情報の長さが長い場合は,BE-LOCALE-BUFFER-LENGTHに指定した長さで位置情報を切り捨てます。ただし,切り捨て位置が多バイト文字の途中に当たる場合は,BE-LOCALE-BUFFER-LENGTHに指定した長さより1バイト短くなってBE-LOCALE-LENGTHに設定されます。BE-LOCALE-BUFFERの多バイト文字で切り捨てられる領域には半角空白文字が設定されます。
  • 環境変数CBLLANGにUNICODEを設定した場合,BE-LOCALE-BUFFERで受け取るBaseElement要素の位置情報は,シフトJISをUTF-8に変換後の文字列が返ります。BE-LOCALE-BUFFER-LENGTHに指定した長さ(1バイト1文字)より,位置情報の文字列が長い場合,BE-LOCALE-BUFFER-LENGTHに指定した長さで文字列を切り捨てます。切り捨て位置が多バイト文字を構成するバイト列の途中に当たる場合は,該当する文字以降を文字単位に切り捨て,1~3バイト短くなってBE-LOCALE-LENGTHに設定されます。BE-LOCALE-BUFFERの多バイト文字で切り捨てられる領域には半角空白文字が設定されます。
次に入力するBaseElement要素の位置を取得し,該当するBaseElement要素を入力する例を次に示します。
(DTDの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE root [
 <!ELEMENT root (group1 | group2 | group3)>
 <!ELEMENT group1 (item1)>
 <!ELEMENT group2 (item1)>
 <!ELEMENT item1 (#PCDATA)>
 <!ELEMENT group3 (item3)>
 <!ELEMENT item3 (#PCDATA)>
]>
<root/>

(DDFの例)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
<BaseElement elemName="item1">
 <Item elemName="item1" size="10"/>
</BaseElement> <BaseElement elemName="item3">
 <Item elemName="item3" size="10"/>
</BaseElement>
</Interface>

(生成されるCOBOLデータ項目)

01 item1 PIC X(10).
01 item3 PIC X(10).

次のXMLドキュメントdata.xmlを入力し,item3要素の内容"ABC"を読み込みます。
(入力データ)

 <?xml version="1.0" encoding="Shift_JIS"?>
 <root>
   <group3>
     <item3>ABC</item3>
   </group3>
 </root>

(COBOLプログラムのコーディング例)

   :
01 CBLXML-RETURN-CODE PIC 9(9) COMP.
01 FILE-NAME PIC X(255).
01 XML-FILE-NAME USAGE POINTER.
01 XML-FILE-NAME-LENGTH PIC 9(9) COMP VALUE 255.
01 XML-MODE PIC X(16).
01 XML-POINTER USAGE POINTER.
01 BE-LOCALE-BUFFER PIC X(255).
01 BE-LOCALE-BUFFER-LENGTH PIC 9(9) COMP VALUE 255.
01 BE-LOCALE-LENGTH PIC 9(9) COMP VALUE 0.
PROCEDURE DIVISION.
START-MAIN.
   :
* open
    MOVE 'R' TO XML-MODE.
    MOVE 'data.xml' TO FILE-NAME.
    MOVE 8 TO XML-FILE-NAME-LENGTH.
    COMPUTE XML-FILE-NAME = FUNCTION ADDR(FILE-NAME).
    CALL 'CBLXML-OP-EXAMPLE'
         USING XML-FILE-NAME
               XML-FILE-NAME-LENGTH
               XML-MODE
               XML-POINTER
         RETURNING CBLXML-RETURN-CODE.
    IF CBLXML-RETURN-CODE NOT = 0 THEN
        DISPLAY 'ERROR - CBLXML-OP-EXAMPLE, STATUS = '
        CBLXML-RETURN-CODE
    END-IF.
* read
    CALL 'CBLXML-GET-NEXT-BE'  …1.
        USING XML-POINTER
              BE-LOCALE-BUFFER
              BE-LOCALE-BUFFER-LENGTH
              BE-LOCALE-LENGTH.
    IF RETURN-CODE = 0 THEN
       IF BE-LOCALE-BUFFER = '/root/group1/item1' OR
          BE-LOCALE-BUFFER = '/root/group2/item1' THEN
           CALL 'CBLXML-RD-EXAMPLE-item1'  …2.
               USING XML-POINTER   item1
               RETURNING CBLXML-RETURN-CODE
           IF CBLXML-RETURN-CODE NOT = 0 THEN
              DISPLAY 'ERROR - READ item1, STATUS = '
              CBLXML-RETURN-CODE
           END-IF

           DISPLAY 'BE-LOCALE-BUFFER = ' BE-LOCALE-BUFFER
           DISPLAY 'item1 = ' item1
       ELSE
       IF BE-LOCALE-BUFFER = '/root/group3/item2' THEN
          CALL 'CBLXML-RD-EXAMPLE-item3  …3.
              USING XML-POINTER   item3
              RETURNING CBLXML-RETURN-CODE
          IF CBLXML-RETURN-CODE NOT = 0 THEN
              DISPLAY 'ERROR - READ item3, STATUS = '
              CBLXML-RETURN-CODE
          END-IF

          DISPLAY 'BE-LOCALE-BUFFER = ' BE-LOCALE-BUFFER
          DISPLAY 'item3 = ' item3
      END-IF
   END-IF.

* close
     CALL 'CBLXML-CL-EXAMPLE'
         USING XML-POINTER
         RETURNING CBLXML-RETURN-CODE.
     IF CBLXML-RETURN-CODE NOT = 0 THEN
         DISPLAY 'ERROR - CBLXML-CL-EXAMPLE, STATUS = '
         CBLXML-RETURN-CODE
     END-IF.
   :

(説明)
  1. 次に入力するBaseElement要素の位置を取得します。
  2. item1要素の内容を入力します。
  3. item3要素の内容を入力します。