MOVE 8 TO XML-FILE-NAME-LENGTH
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 宣言)を復元します。次の点は更新前と異なって出力 されます。
1. 文書型宣言の開始を示す'<!DOCTYPE',ルート要素名,公開識別子,システム識別子,内部サブ セットおよび文書型宣言の終了を示す'>'を区切る空白文字(スペース,タブおよび改行)は,一つ のスペースに置き換えられます。
2. 公開識別子,およびシステム識別子を囲む引用符は,必ず二重引用符(")で出力されます。
• 省略可能な要素(?)や,繰り返し要素(*,+)を 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,EUC-JP 0x20 0x09 (PC の場合)0x0a0d,
(UNIX の場合)0x0a
(PC,HP-UX(IPF),AIX,Linux(x86),
Linux(x64)の場合)UTF-8
0x20 0x09 (PC の場合)0x0a0d
(UNIX の場合)0x0a
(PC,HP-UX(IPF),AIX,Linux(x86),
Linux(x64)の場合)UTF-16,リトルエンディ アン
0x0020 0x0009 (PC の場合)0x000a000d
(UNIX の場合)0x000a
(PC,HP-UX(IPF),AIX,Linux(x86),
Linux(x64)の場合)UTF-16,ビッグエンディ アン
0x2000 0x0900 (PC の場合)0x0a000d00
(UNIX の場合)0x0a00