0

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

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

文件更新前.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>

文件更新后.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>

程序.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,我有<xd:add>带有添加的节点和值的节点)。

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

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

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

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

先感谢您。

4

1 回答 1

0

您可以使用 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 无法正确识别差异?

于 2017-04-24T15:08:05.730 回答