12 XML C用のXmlDiff APIパッケージ

XmlDiffパッケージのメソッドを使用すると、XML文書を比較および変更することができます。XmlDiff()およびXmlPatch()メソッドは、UNIXコマンドのdiffおよびpatchとほぼ同等ですが、XML用に最適化されており、XMLに対応します。

次の表にXML C APIのXmlDiffパッケージで使用できるメソッドの概要を示します。

表12-1 XML C実装のXmlDiffメソッドの概要

関数 概要

XmlDiff()

2つのXML文書の間の変更を判別します。

XmlHash()

DOMのXML文書またはノードのハッシュ値を計算します。

XmlPatch()

入力XML文書に変更を適用します。

12.1 XmlDiff()

2つのXML文書の間の変更を判別します。

XmlDiff()は、Xdiff XMLスキーマに準拠するXML形式の2つのドキュメント間のdiffを取得します。

これらの入力ドキュメントは、DOMツリー、ファイル、URI、orastreamなどとして指定することができます。これらのドキュメントがDOMツリーとして指定されていない場合、両方の入力のDOMツリーが作成されます。差分ドキュメントのDOMが作成され、ドキュメント・ノードが戻されます。

コール元が入力をDOMとして提供する場合、DOMのメモリーは解放されません。

両方のドキュメントのデータ(DOM)エンコーディングは、xctxでのデータ・エンコーディングと同じである必要があります。差分のDOMは、xctxで指定されたデータ・エンコーディングで作成されます。

XmlDiff()で実行可能なアルゴリズムは、グローバル、ローカル、ハッシングによるグローバル、およびハッシングによるローカルの4つです。diffは、4つの場合で異なる可能性があります。

グローバル・アルゴリズムは、挿入、追加、削除および更新操作を使用して最小diffを生成します。これは、ローカル・アルゴリズムよりも多くのメモリーと時間を必要とします。ローカル・アルゴリズムは、最小diffを生成しない場合がありますが、グローバル・アルゴリズムよりも高速であり、より少ない領域を使用します。

ハッシングは、グローバル・アルゴリズムとローカル・アルゴリズムの両方で使用できます。グローバル・アルゴリズムによってハッシングが使用される場合、差分計算の時間は大幅に短縮されますが、差分の質が低下する場合があります。ローカル・アルゴリズムによる場合は、diffの質が向上します。

ハッシングは、使用する深さを指定する必要があります。ハッシングでは、すべての要素ノードのハッシュ値は、そのノードをルートとするサブツリー全体のダイジェストに関連付けられます。diffの計算時には、指定されたハッシュ・レベルの深さを超えてツリーが調べられることはありません。

ハッシングを使用する、またはハッシングを使用しないグローバル・アルゴリズムの出力はドキュメント順操作の要件(ノードがドキュメント・ツリーの先行順走査と同じ順序で表示される)を満たしますが、ローカル・アルゴリズムの出力はこの要件を満たしません。

xdiffで使用される名前空間接頭辞XmlDiff()は、処理中にどの接頭辞が最初に現れるかによって、1つ目または2つ目のdocの接頭辞と同じになる場合があります。名前空間URIは、出力の接頭辞と適切にバインドされます。この名前空間が両方のdocで接頭辞を持たない場合、新しい接頭辞が生成され、xdiff docの名前空間にバインドされます。

構文

xmldocnode *XmlDiff(
   xmlctx *xctx,
   xmlerr *err,
   ub4  flags,
   xmldfsrct firstSourceType,
   void *firstSource,
   void *firstSourceExtra,
   xmldfsrct secondSourceType,
   void *secondSource,
   void *secondSourceExtra,
   uword hashLevel,
   oraprop *properties);
パラメータ In/Out 説明
xctx
IN

XMLコンテキスト

xmlerr
OUT

数値のエラー・コード。正常に終了した場合は、XMLERR_OKを戻します。

flags
IN

次のオプションを使用できます。

  • XMLDF_FL_DEFAULTS(=0)でデフォルトが選択されます。

  • XMLDF_FL_ALGORITHM_GLOBALはグローバル・アルゴリズムです。

  • XMLDF_FL_ALGORITHM_LOCALはローカル・アルゴリズムです。

  • XMLDF_FL_DISABLE_UPDATEは、グローバル・アルゴリズムで更新操作の無効化を示します。

デフォルトでは、グローバル・アルゴリズムが使用されます。

firstSourceType
IN

1つ目のドキュメントのソース・タイプ。0(ゼロ)の場合、firstSourceはDOMドキュメント・ノードとみなされます。

firstSource
IN

1つ目のドキュメントのソースへのポインタ。

firstSourceExtra
IN

バッファ長ポインタのために使用される、1つ目のドキュメントのソースへの追加ポインタ。

secondSourceType
IN

2つ目のドキュメントのソース・タイプ。0(ゼロ)の場合、secondSourceはDOMドキュメント・ノードとみなされます。

secondSource
IN

2つ目のドキュメントのソースへのポインタ。

secondSourceExtra
IN

バッファ長ポインタのために使用される、2つ目のドキュメントのソースへの追加ポインタ。

hashLevel
IN

ハッシングを使用するサブツリーの深さ(ルートの1からカウント)。<=1の場合はハッシングを使用しないことを意味します。

properties
IN

Output Builderに使用

戻り値

(xmldocnode) 差分ドキュメントのドキュメント・ノード。エラー発生時にはNULLが戻されます。

12.2 XmlHash()

DOMのXML文書またはノードのハッシュ値を計算します。

2つのXMLサブツリーのハッシュ値が同じである場合、対応するサブツリーが同じである可能性が非常に高くなります。広く使用される、128ビット・ハッシュ値による暗号ハッシュ関数のメッセージ・ダイジェスト・アルゴリズム5(MD5)を使用してハッシュ値を計算するため、2つの異なる入力が同じMD5ダイジェストにマップされる可能性はほとんどありません。

ソースは、ファイルやURLなどとして指定できます。DOMのドキュメント・ノードや他のDOMノードも指定でき、inputSourceパラメータを使用して指定する必要があります。inputSourceが非ドキュメントのDOMノードの場合、inputSourceExtraはDOMのドキュメント・ノードを指している必要があります。

構文

xmlerr XmlHash(
   xmlctx *xctx,
   xmlhasht *digest,
   ub4 flags,
   xmldfsrct iputSourceType,
   void *inputSource,
   void *inputSourceExtra,
   oraprop *properties);
パラメータ In/Out 説明
xctx
IN

XMLコンテキスト

digest
OUT

XMLサブツリーのハッシュ値。

flags
IN

使用されません

inputSourceType
IN

入力ドキュメントのソース・タイプ。0(ゼロ)の場合、inputSourceはDOMドキュメント・ノードとみなされます

inputSource
IN

入力ドキュメントのソースへのポインタ。

inputSourceExtra
IN

入力ドキュメントのソースへの追加ポインタ。DOMのノード・ポインタに使用される場合は、inputSourceがドキュメント・ノードである必要があります。

properties
IN

使用されません

戻り値

(xmlerr) 数値のエラー・コード。正常に終了した場合は、XMLERR_OKを戻します。

12.3 XmlPatch()

XmlPatch()は、Xdiffスキーマ準拠の変更を入力ドキュメントに適用します。入力ドキュメントおよびdiffドキュメントは、DOMツリー、ファイル、URIまたはバッファとして指定することができます。

入力ドキュメントおよびdiffドキュメントがDOMとして指定されていない場合は、それらのDOMが作成されます。

入力ドキュメントと差分ドキュメントの両方のデータ(DOM)エンコーディングは、xctxでのデータ・エンコーディングと同じである必要があります。パッチ適用済のDOMは、xctxで指定されたデータ・エンコーディング内に存在します。

スナップショット・モデルでは、単純なXPathのみがサポートされます。XPathは、/a[1]/b[2]などの簡略化された構文で示される位置によってノードを識別します。XmlDiff()によって生成されるXPathは、この要件を満たします。また、ドキュメント順操作の条件は、TRUEである必要があります。つまり、ノードをドキュメント・ツリーの先行順走査と同じ順序で表示する必要があります。グローバルは(ハッシングを使用しても、ハッシングを使用しなくても)この要件を満たします。ローカルは、この要件を満たしません。

プログラミング・インタフェースは、差分ドキュメントで使用される出力モデルを指定する必要があります。oracle-xmldifは、最上位のxdiff要素の最初の子になります。また、操作をドキュメント順にするかどうか(TRUEまたはFALSE)、および出力モデルをスナップショット・モデルと現在のモデルのいずれにするかを指定するフラグを使用する必要があります。

構文

xmldocnode *XmlPatch(
   xmlctx *xctx,
   xmlerr *err,
   ub4  flags,
   xmldfsrct inputSourceType,
   void *inputSource,
   void *inputSourceExtra,
   xmldfsrct diffSourceType,
   void *diffSource,
   void *diffSourceExtra,
   oraprop *properties);
パラメータ In/Out 説明
xctx
IN

XMLコンテキスト

xmlerr
OUT

数値のエラー・コード。正常に終了した場合は、XMLERR_OKを戻します。

flags
IN

次のオプションを利用できます。

  • XMLDF_FL_DEFAULTS(=0)でデフォルトが選択されます。

inputSourceType
IN

入力ドキュメントのソース・タイプ。0(ゼロ)の場合、inputSourceはDOMドキュメント・ノードとみなされます。

inputSource
IN

入力ドキュメントのソースへのポインタ。

inputSourceExtra
IN

バッファ長ポインタに使用される、入力ドキュメントのソースへの追加ポインタ。

diffSourceType
IN

diffドキュメントのソース・タイプ。0(ゼロ)の場合、secondSourceはDOMドキュメント・ノードとみなされます。

diffsSource
IN

diffドキュメントのソースへのポインタ。

diffSourceExtra
IN

バッファ長ポインタに使用される、diffドキュメントのソースへの追加ポインタ。

properties
IN

使用されません

戻り値

(xmldocnode) パス指定されたDOMのドキュメント・ノード。エラー発生時にはNULLが戻されます。