変更されたノードのリストを取得したいとします(ノードの追加とノードの更新)。C#:2つのXMLファイルの差分 - 変更/更新されたノードのみを取得する
これは、(更新前と後)
私のプログラムおよび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
が更新されたノードを指定しない...
は、事前にありがとうございます。
を私は_well-formed_であるためにあなたのXMLファイルの両方を完了しました。 – zx485
diffgram形式の詳細については、 https://msdn.microsoft.com/en-us/library/aa302295.aspx を参照してください。コードスニペットには、処理方法を示すものもあります。また、XmlDiffViewクラスのソースコードについては、https://github.com/fschwiet/PSUpdateXml/blob/master/tools/XmlDiffPatch/Samples/XmlDiffView/XmlDiffView.csを参照してください。幸運;) – Rogn
私はこのドキュメントを読んだが、彼女は私を助けなかった。私はどのように変更されているノード名を取得するために行うことができますが見つかりませんでした... – Dooxe