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>