12 XML C用のXmlDiff APIパッケージ
XmlDiff
パッケージのメソッドを使用すると、XML文書を比較および変更することができます。XmlDiff()およびXmlPatch()メソッドは、UNIXコマンドのdiff
およびpatch
とほぼ同等ですが、XML用に最適化されており、XMLに対応します。
次の表にXML C APIのXmlDiff
パッケージで使用できるメソッドの概要を示します。
表12-1 XML C実装のXmlDiffメソッドの概要
関数 | 概要 |
---|---|
2つのXML文書の間の変更を判別します。 |
|
DOMのXML文書またはノードのハッシュ値を計算します。 |
|
入力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 |
数値のエラー・コード。正常に終了した場合は、 |
flags |
IN |
次のオプションを使用できます。
デフォルトでは、グローバル・アルゴリズムが使用されます。 |
firstSourceType |
IN |
1つ目のドキュメントのソース・タイプ。0(ゼロ)の場合、 |
firstSource |
IN |
1つ目のドキュメントのソースへのポインタ。 |
firstSourceExtra |
IN |
バッファ長ポインタのために使用される、1つ目のドキュメントのソースへの追加ポインタ。 |
secondSourceType |
IN |
2つ目のドキュメントのソース・タイプ。0(ゼロ)の場合、 |
secondSource |
IN |
2つ目のドキュメントのソースへのポインタ。 |
secondSourceExtra |
IN |
バッファ長ポインタのために使用される、2つ目のドキュメントのソースへの追加ポインタ。 |
hashLevel |
IN |
ハッシングを使用するサブツリーの深さ(ルートの |
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 |
IN |
入力ドキュメントのソースへのポインタ。 |
inputSourceExtra |
IN |
入力ドキュメントのソースへの追加ポインタ。DOMのノード・ポインタに使用される場合は、 |
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 |
数値のエラー・コード。正常に終了した場合は、 |
flags |
IN |
次のオプションを利用できます。
|
inputSourceType |
IN |
入力ドキュメントのソース・タイプ。0(ゼロ)の場合、 |
inputSource |
IN |
入力ドキュメントのソースへのポインタ。 |
inputSourceExtra |
IN |
バッファ長ポインタに使用される、入力ドキュメントのソースへの追加ポインタ。 |
diffSourceType |
IN |
|
diffsSource |
IN |
|
diffSourceExtra |
IN |
バッファ長ポインタに使用される、 |
properties |
IN |
使用されません |
戻り値
(xmldocnode)
パス指定されたDOMのドキュメント・ノード。エラー発生時にはNULL
が戻されます。