【问题标题】:Comparing with two XML file and get the difference between them in anew XML file比较两个 XML 文件并在新的 XML 文件中获取它们之间的差异
【发布时间】:2019-09-24 07:02:25
【问题描述】:

我需要帮助我有两个 XML 文件,它们具有相同的 id("name") 我想了解它们之间的区别。 如果我在 Xml file_1 中有额外的节点,那么它将转到 diff。 xml 文件仅根据 id。 我已经写了一些代码,但我不知道它会怎样;我知道我们可以在 Microsoft Diff and Patch 工具中做,但我想要一个不同的代码: 这是我的代码:

    public static void Main()
    {
           //fields
         const string XML1 = @"File_1.xml";
         const string XML2 = @"File_2.xml";
         const string ResultFile = @"ResultFile.xml";
         XmlDocument doc1 = new XmlDocument();
         doc1.Load(XML1);
         XmlDocument doc2 = new XmlDocument();
         doc2.Load(XML2);

         for(var d = 0; d < doc1.SelectNodes("root/data").Count; d++)
         {
             var child = doc1.SelectNodes("root/data")[d];
            if (I don't know …..) {

           }
         }

XML fil_1

<root>
  <data name="senChangePassword" xml:space="preserve">
    <value>Byt lösenord</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
  <data name="senChangesWereSuccessfullySaved" xml:space="preserve">
    <value>Ändringarna är sparade</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
  <data name="senChangeUserSettings" xml:space="preserve">
    <value>Ändra uppgifter</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
  <data name="senCompareWith" xml:space="preserve">
    <value>Jämför</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
  <data name="senCreatedQuestions" xml:space="preserve">
    <value>Skapade frågor</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
</root>

** XML 文件_2**

<root>
  <data name="senChangePassword" xml:space="preserve">
    <value>Change Password</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
  <data name="senChangesWereSuccessfullySaved" xml:space="preserve">
    <value>Saved changes</value>
    <comment>Sprint 02  Jessica</comment>
  </data>
  <data name="senCompareWith" xml:space="preserve">
    <value>Compare</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
</root>

XML 文件_结果

<root>
  <data name="senChangeUserSettings" xml:space="preserve">
    <value>Ändra uppgifter</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
  <data name="senCreatedQuestions" xml:space="preserve">
    <value>Skapade frågor</value>
    <comment>Sprint 02 - Jessica</comment>
  </data>
</root>

【问题讨论】:

  • 代码对我来说很难,它很高级,我不理解 xml.linq,我需要一个代码,只需要“使用 system.xml”。我只想比较节点 id 而不是空格或内部文本。
  • 这是一个非常具有挑战性的问题。考虑投资像 DeltaXML 这样的解决方案,而不是尝试自己解决这个问题。
  • 但在您的链接代码中,结果文件将是我的 xml 文件的两个文件,我不需要。您能否更改代码以获得相同的结果文件,因为我不知道 linq。
  • 解决方案在 Xml Linq 中使用左外连接要简单得多。

标签: c# .net xml


【解决方案1】:

简单版(如果您不关心性能或内存大小):

using System.Linq;

// ....
var nodes1 = doc1.SelectNodes("root/data");
var children1 = new List<XmlNode>();
int i = 0;
foreach(XmlNode a in nodes1) { children1[i++] = a; }
var nodes2 = doc2.SelectNodes("root/data");
var children2 = new List<XmlNode>();
i = 0;
foreach(XmlNode b in nodes2) { children2[i++] = b; }
var result = new List<XmlNode>();

for(var d = 0; d < children1.Count; d++)
         {
             var child = children1[d];
             var match = children2.FirstOrDefault(x=>
                 XElement.Parse(x.OuterXml).ToString() == XElement.Parse(child.OuterXml).ToString());
            if (match == null) {
               result.Add(child);
           }
         }

并将结果节点转储到您认为合适的结果文件中

【讨论】:

  • 您可能还想查看stackoverflow.com/questions/6442123/… 以了解 XmlNode 与其匹配字符串之间的对偶性。几乎是一样的。
  • 感谢您的回答,这行代码中有两个错误: var result = List();在这一行中: var match = children2.FirstOrDefault(......); fel 是 XMLNodeList 不包含 (FirstOrDefault) 的定义。我应该在这里做什么,
  • 你需要添加命名空间“using System.Linq;”
  • 我提供了它,但它不起作用。请问应该怎么做
  • 感谢@Osama 的注释——这就是我在stackoverflow 中即时编写代码所得到的。真丢脸:o)希望这会有所帮助......
猜你喜欢
  • 1970-01-01
  • 2015-08-10
  • 2016-03-28
  • 2023-03-07
  • 1970-01-01
  • 2015-08-26
  • 2020-10-07
  • 1970-01-01
  • 2014-06-08
相关资源
最近更新 更多