0

変更されたノードのリストを取得したいと思います (ノードの追加とノードの更新)。

これは私のプログラムと 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は更新されたノードを指定しません...

前もって感謝します。

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 に答える