4

ツールを使用してXMLdiffpatch2 つの xml ファイル間の変更を検出しています。ツールの出力 xml ファイルは次のようになります。

<?xml version="1.0" encoding="utf-16"?>
<xd:xmldiff version="1.0" srcDocHash="5708212576896487287" options="None" fragments="no" xmlns:xd="http://www.microsoft.com/xmldiff">
    <xd:node match="2">
        <xd:node match="3"/>
        <xd:add>
            <e>Some text 4</e>
            <f>Some text 5</f>
        </xd:add>
        <xd:node match="4">
            <xd:change match="1">Changed text</xd:change>
            <xd:remove match="2"/>
        </xd:node>
        <xd:node match="5">
            <xd:remove match="@secondAttr"/>
            <xd:add type="2" name="newAttr">new value</xd:add>
            <xd:change match="@firstAttr">changed attribute value</xd:change>
        </xd:node>
        <xd:remove match="6" opid="1"/>
        <xd:add type="1" name="p">
            <xd:add type="1" name="q">
                <xd:add match="/2/6" opid="1"/>
            </xd:add>
        </xd:add>
    </xd:node>
    <xd:descriptor opid="1" type="move"/>
</xd:xmldiff>

最初のファイル:

<?xml version="1.0"?>
<b>
  <a>Some text 1</a>
  <b>Some text 2</b>
  <c>Some text 3</c>
  <d>
    Another text
    <foo/>
  </d>
  <x firstAttr="value1" secondAttr="value2"/>
  <y>
    <!--Any comments?-->
    <z id="10">Just another text</z>
  </y>
</b>

2 番目のファイル:

<?xml version="1.0"?>
<b>
  <a>Some text 1</a>
  <b>Some text 2</b>
  <c>Some text 3</c>
  <e>Some text 4</e>
  <f>Some text 5</f>
  <d>Changed text</d>
  <x firstAttr="changed attribute value" newAttr="new value"/>
  <p>
    <q>
      <y>
        <!--Any comments?-->
        <z id="10">Just another text</z>
      </y>
    </q>
  </p>
</b>

ご覧のとおり、xml は検出されたノードの変更を、親ノードに対応するインデックスに表示します。私が今直面している問題は、元の xml ファイル内の実際のノード名に置き換えるために、これらのインデックスを解析する方法です。

4

1 に答える 1

2

xml diff に表示される「一致」番号は、子ノードの相対インデックスです。1 番目のファイルから 2 番目のファイルを構築するために、xml 差分全体が構築されます。あなたの例では、

<xd:node match="2">
  <xd:node match="3"/>
    <xd:add>
        <e>Some text 4</e>
        <f>Some text 5</f>
    </xd:add>

意味:

「最初のファイルで、ルートから 2 番目の子ノードを見つけます」 - つまり、 <?xml>宣言の後のノード<b>です。

「見つかったノードで、3 番目の子ノードを見つけます」 - つまり<c>テキスト 3</c>

「ノードが見つかったら、次のテキストを挿入します」 - ノード e と f を挿入します。

MSDN にxmldiff 形式に関する非常に詳細な記事があり、いくつかのコード サンプルと xmldiff 言語仕様が含まれています。

したがって、インデックスを実際の値に置き換えるには、差分インデックスに従ってソース ドキュメントをトラバースし、実際のノード名を抽出する必要があります。この質問には、子ノードをトラバースするための優れたコード サンプルがあります。

于 2013-04-16T22:07:34.463 に答える