4

我正在使用XMLdiffpatch工具来检测两个 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>

第二个文件:

<?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 中看到的“匹配”数字是子节点的相对索引。构建整个 xml 差异以从第一个文件构造第二个文件。在你的例子中,

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

意思是:

“在第一个文件中,从根中定位第二个子节点”——即 <?xml>声明之后的节点<b> 。

“在找到的节点中,定位第三个子节点” - 即<c>Some text 3</c>

“找到节点后,插入以下文本” - 插入节点 e 和 f。

MSDN 上有一篇关于xmldiff 格式的非常详细的文章,其中包含一些代码示例和 xmldiff 语言规范。

因此,为了将索引替换为实际值,您需要根据差异索引遍历源文档,并提取实际节点名称。这个问题有很好的代码示例来遍历子节点。

于 2013-04-16T22:07:34.463 回答