COBOL2002 XML連携機能ガイド


7.2.11 XMLドキュメントの更新

XMLドキュメントの更新をする場合のXMLアクセスルーチンの呼び出し順を次に示します。

(DTDの例)
<?xml version="1.0" encoding="Shift_JIS"?>
 
<!DOCTYPE root [
  <!ELEMENT root (X)>
  <!ELEMENT X (A,B?)>
  <!ELEMENT A (#PCDATA)>
  <!ELEMENT B (#PCDATA)>
]>
<root/>
(DDFの例)
<?xml version="1.0" encoding="Shift_JIS"?>
 
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="X">
  <Group elemName="X" update="yes">
   <Item elemName="A" size="5"/>
   <Item elemName="B" size="5"/>
  </Group>
 </BaseElement>
</Interface>
(生成されるCOBOLデータ項目)
01 X.
 02 A PIC X(5).
 02 B PIC X(5).
(COBOL原始プログラム)
                 :
* open
     MOVE 'U' 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'     …1.
         USING XML-FILE-NAME
               XML-FILE-NAME-LENGTH
               XML-MODE
               XML-POINTER
         RETURNING CBLXML-RETURN-CODE.
 
* read
     CALL 'CBLXML-RD-EXAMPLE-X'   …2.
         USING XML-POINTER X
         RETURNING CBLXML-RETURN-CODE.
     MOVE 'new A' TO A.
     MOVE 'new B' TO B.
 
* write
     CALL 'CBLXML-WR-EXAMPLE-X'   …3.
         USING XML-POINTER X
         RETURNING CBLXML-RETURN-CODE.
 
* close
     CALL 'CBLXML-CL-EXAMPLE'     …4.
         USING XML-POINTER
         RETURNING CBLXML-RETURN-CODE.
                  :

XMLドキュメントを更新する場合,次の順序でXMLアクセスルーチンを呼び出す必要があります。

  1. アクセスモード"U"(更新)を指定して,CBLXML-OP-EXAMPLEアクセスルーチンでXMLドキュメントを開く。

  2. CBLXML-RD-EXAMPLE-Xアクセスルーチンで更新対象を入力する。

  3. CBLXML-WR-EXAMPLE-Xアクセスルーチンで更新対象を更新する。

  4. CBLXML-CL-EXAMPLEアクセスルーチンでXMLドキュメントを閉じる。

XMLドキュメント

(更新前)
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
  <X>
    <A>AAA01</A>
    <B>BBB01</B>
  </X>
</root>
(更新後)
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
  <X>
    <A>new A</A>
    <B>new B</B>
  </X>
</root>
繰り返し要素の内側にBaseElement要素を対応づけた場合は,更新したい位置までCBLXML-RD-Interface-BaseElementアクセスルーチンを繰り返し呼び出し,更新したい項目に値を代入して,CBLXML-WR-Interface-BaseElementアクセスルーチンを呼び出すことで更新してください。3回目のrow要素を更新する場合のXMLアクセスルーチンの呼び出し例を次に示します。

(例)

CBLXML-OP-xyz                     ("U"更新モードでXMLドキュメントを開く)
CBLXML-RD-xyz-row                 (1回目のrow要素を入力する)
CBLXML-RD-xyz-row                 (2回目のrow要素を入力する)
CBLXML-RD-xyz-row                 (3回目のrow要素を入力する)
ADD 1 TO QUANTITY OF ROW          (更新したい要素に値を指定する)
CBLXML-WR-xyz-row                 (3回目のrow要素を更新する)
CBLXML-CL-xyz                     (XMLドキュメントを閉じる)

update属性に"yes"を指定したGroup要素をelemName属性で対応づけた場合,Group要素以下が更新の対象になります。cobName属性だけで対応づけた場合は,Group要素の直下のGroup要素,およびItem要素以下が更新の対象となります。

次に,elemName属性で対応づけた場合と,cobName属性で対応づけた場合の例を示します。

(DTDの例)
<?xml version="1.0" encoding="Shift_JIS"?>
 
<!DOCTYPE root [
  <!ELEMENT root (X)>
  <!ELEMENT X (A,B)>
  <!ELEMENT A (#PCDATA)>
  <!ELEMENT B (#PCDATA)>
]>
<root/>

(DDFの例)

指定例1

(elemName属性で対応づけた場合)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="X">
 <Group elemName="X" update="yes">
   <Item elemName="A" size="5"/>
   <Item elemName="B" size="5"/>
 </Group>
 </BaseElement>
</Interface>
指定例2

(cobName属性で対応づけた場合)

<?xml version="1.0" encoding="Shift_JIS"?>
<Interface interfaceName="EXAMPLE">
 <BaseElement elemName="X">
 <Group cobName="X" update="yes">
   <Item elemName="A" size="5"/>
   <Item elemName="B" size="5"/>
 </Group>
 </BaseElement>
</Interface>
(生成されるCOBOLデータ項目)
01 X.
 02 A PIC X(5).
 02 B PIC X(5).
(更新されるXMLドキュメント)
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
  <X>
    <A>AAA</A>
    <!-- COMMENT -->
    <B>BBB</B>
  </X>
</root>
(更新後のXMLドキュメント)

指定例1の更新結果

elemName要素で対応づけた場合,X以下の要素が更新の対象となり更新時にコメントは削除されます。
<?xml version="1.0" encoding="Shift_JIS"?>
 
<root>
  <X>
    <A>New A</A>
    <B>New B</B>
  </X>
</root>

指定例2の更新結果

cobName要素だけで対応づけた場合,Xの直下のA要素とB要素が更新の対象となり,Xの直下のコメントは,更新されません。

<?xml version="1.0" encoding="Shift_JIS"?>

<root>
  <X>
    <A>New A</A>
    <!-- COMMENT -->
    <B>New B</B>
  </X>
</root>