【问题标题】:C#: Diff of two XML files - get only the nodes that have been modified/updatedC#:两个 XML 文件的差异 - 仅获取已修改/更新的节点
【发布时间】:2017-02-27 20:55:13
【问题描述】:

我想获取已修改的节点列表(添加的节点和更新的节点)。

这是我的程序和 XML 文件(更新前后)

fileBeforeUpdate.xml

<?xml version="1.0"?>
<DESCRIPTION>
    <DISTRIBUE_PAR>
      <UID>0000000000001</UID>
      <NOM>Anthony</NOM>
    </DISTRIBUE_PAR>
    <OBJET>Object Node</OBJET>
    <SUPPORT HREF="#PAPER"/>
    <NUMEROS_CHRONO>
      <CHRONO_1>aqwzsxedc-123456</CHRONO_1>
    </NUMEROS_CHRONO>
    <REFERENCE>reference</REFERENCE>
</DESCRIPTION>

fileAfterUpdate.xml

<?xml version="1.0"?>
<DESCRIPTION>
    <DISTRIBUE_PAR>
      <NOM>Antoni</NOM>
    </DISTRIBUE_PAR>
    <OBJET>Object Node</OBJET>
    <SUPPORT HREF="#MAIL"/>
    <NUMEROS_CHRONO>
      <CHRONO_1>aqwzsxedc-123456</CHRONO_1>
    </NUMEROS_CHRONO>
    <REFERENCE>reference</REFERENCE>
    <DATE>01/03/1994</DATE>
</DESCRIPTION>

Program.cs

var sb = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(sb))
{
    XmlDiff diff = new XmlDiff(XmlDiffOptions.IgnoreComments | XmlDiffOptions.IgnoreWhitespace | XmlDiffOptions.IgnoreNamespaces);
    diff.Compare(@"C:\fileBeforeUpdate", @"C:\fileAfterUpdate", true, xmlWriter);
    diff.Algorithm = XmlDiffAlgorithm.Precise;

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(sb.ToString());
 }

这是StringBuilder 输出:

<xd:node match=\"1\">
    <xd:node match=\"1\">
        <xd:remove match=\"1\" />
        <xd:node match=\"2\">
            <xd:change match=\"1\">Antoni</xd:change>
        </xd:node>
    </xd:node>
    <xd:node match=\"3\">
        <xd:change match=\"@HREF\">#MAIL</xd:change>
    </xd:node>
    <xd:node match=\"5\" />
    <xd:add>
        <DATE>01/03/1994</DATE>
    </xd:add>
</xd:node>

要获得添加的节点列表,很容易(在StringBuilder,我有节点&lt;xd:add&gt;,其中添加了节点和值)。

var addNodes = doc.GetElementsByTagName("xd:add");
var xmlNodesAdded = new StringBuilder();

foreach (XmlNode node in addNodes)
{
       xmlNodesAdded.Append(node.InnerXml);
       xmlNodesAdded.AppendLine();
}

但是,要获取已修改的节点(和属性)列表,则比较困难...

我怎样才能做到这一点?
StringBuilder中,节点xd:change不指定已经更新的节点...

提前谢谢你。

【问题讨论】:

标签: c# .net xml xmldiff


【解决方案1】:

您可以使用 XmlDiffView 获得更改的 HTML 表示。 (在某些情况下,它不会正确识别更改类型)。

public string GetChangeHtml(string originalXML, string changedXML)
{
    XmlDiffView view = new XmlDiffView();
    var diffgram = Diff(originalXML, changedXML);
    string ret = "";
    using (StringReader legacySr = new StringReader(originalXML), diffGramSr = new StringReader(diffgram.ToString()))
    {
        using (XmlReader legacyReader = XmlReader.Create(legacySr), diffgramReader = XmlReader.Create(diffGramSr))
        {
            using (StringWriter sw = new StringWriter())
            {
                view.Load(legacyReader, diffgramReader);
                view.GetHtml(sw);
                ret = sw.ToString();
            }
        }
    }
    return ret;
}

检查下面我的问题中的代码: XMLDiff fails to recognize differences correcly?

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2012-09-20
    • 2010-09-24
    • 2019-07-07
    相关资源
    最近更新 更多