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が戻されます。