• 検索結果がありません。

XML ドキュメントの更新機能の注意事項

ドキュメント内 COBOL2002 XML連携機能ガイド (ページ 196-199)

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

ドキュメント内 COBOL2002 XML連携機能ガイド (ページ 196-199)