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アクセスルーチンを呼び出す必要があります。
-
アクセスモード"U"(更新)を指定して,CBLXML-OP-EXAMPLEアクセスルーチンでXMLドキュメントを開く。
-
CBLXML-RD-EXAMPLE-Xアクセスルーチンで更新対象を入力する。
-
CBLXML-WR-EXAMPLE-Xアクセスルーチンで更新対象を更新する。
-
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>