7.2.12 XMLドキュメントの更新機能の注意事項
-
XMLドキュメントの更新処理では,更新対象外の部分であっても,更新前後で異なって出力される部分があります。詳細については,「付録E.7 入力ドキュメントとの相違点」を参照してください。
-
更新対象以外の要素の値や属性の値に,定義済み実体参照や文字参照がある場合,「付録D.1 定義済み実体参照」の規則に従って変換して更新されます。更新対象の要素の値や属性の値に,定義済み実体参照や文字参照がある場合は,cblxmlコマンドの-nopeconvオプション(実体参照を変換しない)の指定に従って更新されます。
-
XMLドキュメントを更新した場合,XMLドキュメントのXML宣言は,属性「version="1.0"」,およびencoding属性だけのXML宣言に変更されます。更新後の文字エンコーディングは,「付録G.1(1) 出力するXMLドキュメントの文字エンコーディングの設定」に従って出力されます。更新機能を使用する場合,開いたXMLドキュメントの文字エンコーディングではなく出力するXMLドキュメントの文字エンコーディングの設定に従って変更されます。
-
更新前のXMLドキュメントに文書型宣言(DOCTYPE宣言)がある場合,更新後のXMLドキュメントに,更新前と等価な文書型宣言(DOCTYPE宣言)を復元します。次の点は更新前と異なって出力されます。
-
文書型宣言の開始を示す'<!DOCTYPE',ルート要素名,公開識別子,システム識別子,内部サブセットおよび文書型宣言の終了を示す'>'を区切る空白文字(スペース,タブおよび改行)は,一つのスペースに置き換えられます。
-
公開識別子,およびシステム識別子を囲む引用符は,必ず二重引用符(")で出力されます。
-
-
省略可能な要素(?)や,繰り返し要素(*,+)をBaseElement要素に対応づけ,属性update="yes"を指定して更新の対象とした場合,BaseElement要素に入出力した要素の値を更新できますが,追加,および削除はできません。
例えば,BaseElement要素に対応づけた省略可能な要素が入力するXMLドキュメントに存在しない場合,その省略可能な要素の値を指定しても,その要素を出力できません。また,BaseElement要素に対応づけた省略可能な要素が入力するXMLドキュメントに存在する場合,emptyValue属性やアクセス情報フラグで要素を出力しないようにしても,削除できません。その場合,空要素が出力されます。
-
要素を更新の対象とした場合,その要素の属性も更新の対象とみなされるため,更新の対象とした要素の属性は,DDFで対応づけなければなりません。対応づけない場合は,属性の指定に従い,値が空に更新されるか,または属性が削除されます。
-
XMLドキュメントを更新する場合,更新する要素や属性とそれらの値は,数値や文字列の出力規則に従って更新されます。詳細については「7.2.7 値の入力,出力の動作」を参照してください。
-
更新するXMLドキュメントの要素が次に示すように改行がなく,横に並んでいても更新する要素の内容だけが更新されます。
B要素を更新した場合
(更新前)
<A>123</A><B>456</B><C>789</C>
(更新後)
<A>123</A><B>777</B><C>789</C>
-
更新モードでの出力時に,属性update="yes"を指定していない要素の値を変更しても,更新されません。
-
バッファのXMLドキュメントを更新する場合で,更新前のXMLドキュメントの長さより更新後のXMLドキュメントが短くなったときは,短くなった領域は不定になります。そのため,CBLXML-CN-Interfaceアクセスルーチンを使用して更新後のXMLドキュメントの長さを取得し,更新後のXMLドキュメントの部分だけを参照してください。
-
省略可能な要素で複数の子要素を持つ場合,その子要素の一つだけにupdate="yes"を指定して,更新時に追加や削除をすると妥当でないXMLドキュメントが出力されます。このような省略可能な要素で複数の子要素を持つ場合は,すべての子要素にupdate="yes"を指定してください。次に一つのItem要素だけにupdate="yes"を指定する不当な書き方の例を示します。
(DTDの例)
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE root [ <!ELEMENT root (group1)> <!ELEMENT group1 (item1, item2)? > <!ELEMENT item1 (#PCDATA)> <!ELEMENT item2 (#PCDATA)> ]> <root/>
(DDFの例)
<?xml version="1.0" encoding="Shift_JIS"?> <Interface interfaceName="EXAMPLE"> <BaseElement elemName="group1"> <Group elemName="group1"> <Item elemName="item1" size="10" update="yes"/> <Item elemName="item2" size="10"/> </Group> </BaseElement> </Interface>
emptyValue値"SPACE"をCOBOLデータ項目に設定することでitem1要素を削除したとき,次のように更新後のドキュメントはDTDに対して妥当でなくなります。item1要素とitem2要素の両方にupdate="yes"属性を指定し,item1要素を削除した場合は,item2要素も削除してください。
(更新前)
<?xml version="1.0" encoding="Shift_JIS"?> <root> <group1> <item1>data1</item1> <item2></item2> </group1> </root>
(更新後の不当なXMLドキュメント)
<?xml version="1.0" encoding="Shift_JIS"?> <root> <group1> <item2/> </group1> </root>
-
ファイル上のXMLドキュメントを更新した場合,更新対象となる要素の前後にある空白文字(スペース,タブおよび改行)の個数や位置が更新の前後で異なって出力されることがあります。
-
属性だけを更新することはできません。属性を更新する場合,属性に対応する要素も対応づけてください。
-
XMLドキュメントを更新した場合,XML宣言と文書型宣言(DOCTYPE宣言)の間のコメントは削除されます。
-
バッファ上のXMLドキュメントを更新する際にバッファ長を超えた場合,CBLXML-CL-Interface,CBLXML-CN-InterfaceアクセスルーチンでXMLドキュメントを閉じるときにバッファ長を超えた旨のステータス115が返されます。CBLXML-WR-Interface-BaseElementアクセスルーチンではバッファ長を超えた旨のステータス115が返されませんので注意してください。
-
DTDを持つXMLドキュメントを更新した場合,DTD上でデフォルト値を持つ属性は,更新対象外の部分であっても,更新後のXMLドキュメントに出力されます。
-
バッファのXMLドキュメントを更新する場合で,更新するXMLドキュメントを超えるバッファの領域は更新するXMLドキュメントの文字エンコーディングに従った空白文字(スペース,タブおよび改行)でなければなりません。
文字エンコーディング
スペース
タブ
改行
Shift_JIS,Windows-31J,EUC-JP
0x20
0x09
(Windowsの場合)0x0a0d,
(UNIXの場合)0x0a
UTF-8
0x20
0x09
(Windowsの場合)0x0a0d
(UNIXの場合)0x0a
UTF-16,リトルエンディアン
0x0020
0x0009
(Windowsの場合)0x000a000d
(UNIXの場合)0x000a
UTF-16,ビッグエンディアン
0x2000
0x0900
(Windowsの場合)0x0a000d00
(UNIXの場合)0x0a00