【发布时间】: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,我有节点<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不指定已经更新的节点...
提前谢谢你。
【问题讨论】:
-
我完成了您的两个 XML 文件,使其格式正确。
-
您可以在此处阅读有关 diffgram 格式的更多信息:msdn.microsoft.com/en-us/library/aa302295.aspx 还有一些代码 sn-ps,显示您如何处理它。所讨论的 XmlDiffView 类的源代码可以在这里找到:github.com/fschwiet/PSUpdateXml/blob/master/tools/XmlDiffPatch/…。祝你好运;)
-
我已阅读此文档,但她没有帮助我。我没有找到如何获取已修改的节点名称...