【问题标题】:How to compare XML files in C#?如何在 C# 中比较 XML 文件?
【发布时间】:2011-11-11 15:27:50
【问题描述】:

我知道有很多这样的问题,但我找不到能满足我需求的答复。我必须编写一个比较 XML 文件的应用程序:将有 2 种比较类型,第一种用于 2 个文件,列出所有差异,第二种用于多个 XML 文件,列出与平均值的所有变化。

我正在寻找某种类、库或 API 来帮助我完成这项任务。你能提出一些解决方案吗?

然而,我不知道我应该使用 DOM 还是 Xpath。有什么建议么 ?

编辑:

好的,所以我一直在尝试使用 XmlDiff 工具来完成这项任务,但是对于多个 Xml 文件来说解决这个问题非常有问题 - 我不知道如何使用这个 XmlDiffDiagram 来整理出例如 50 个 Xml 文件之间的差异.

使用 LINQ 会更好吗?

【问题讨论】:

    标签: c# xml compare


    【解决方案1】:

    微软的XML Diff and Patch API 应该可以很好地工作:

    public void GenerateDiffGram(string originalFile, string finalFile,
                           XmlWriter diffGramWriter)
        {
            XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
                                          XmlDiffOptions.IgnoreNamespaces |
                                          XmlDiffOptions.IgnorePrefixes);
            bool bIdentical = xmldiff.Compare(originalFile, finalFile, false, diffGramWriter);
            diffGramWriter.Close();
        }
    

    如果需要,还可以使用补丁工具比较文件并合并:

    public void PatchUp(string originalFile, string diffGramFile, string outputFile)
        {
            XmlDocument sourceDoc = new XmlDocument(new NameTable());
            sourceDoc.Load(originalFile);
    
            using (var reader = XmlReader.Create(diffGramFile))
            {
                XmlPatch xmlPatch = new XmlPatch();
                xmlPatch.Patch(sourceDoc, reader);
    
                using (var writer = XmlWriter.Create(outputFile))
                {
                    sourceDoc.Save(writer);
                    writer.Close();
                }
                reader.Close();
            }
        }
    

    【讨论】:

    • 好的,我已经阅读了一些关于它的文章和一些文档,但我认为这是比较两个文档的好方法。比较其中的很多并总结(报告)差异怎么样?
    • 你打算如何展示它?听起来这需要相当多的工作。
    • 任务是执行1)两个xml文件比较和2)多个文件比较。在2)我必须显示例如数字范围(可能是平均值)和平均值的变化(例如,如果除了一个文件之外的所有文件中都有相同的值)和字符串的变化(我还不知道该怎么做它)。用户将能够从数据库中选择要比较的 XML。
    • -1:我确定这是一个复制/粘贴的示例,但请您 1) 使用 XmlReader.Create 而不是 new XmlTextWriter,以及 2) 在 @ 周围放置 using 块987654327@ 个实例。然后我会投票。
    • 微软网站上的下载链接失效:(
    【解决方案2】:

    如果您只想比较 XML 并且不需要了解有什么不同,可以使用 XNode.DeepEquals Method:

    var xmlTree1 = new XElement("Root",
        new XAttribute("Att1", 1),
        new XAttribute("Att2", 2),
        new XElement("Child1", 1),
        new XElement("Child2", "some content")
    );
    var xmlTree2 = new XElement("Root",
        new XAttribute("Att1", 1),
        new XAttribute("Att2", 2),
        new XElement("Child1", 1),
        new XElement("Child2", "some content")
    );
    Console.WriteLine(XNode.DeepEquals(xmlTree1, xmlTree2));
    

    【讨论】:

      【解决方案3】:

      就个人而言,我会使用 LINQ to XML。您可以在以下位置找到一个很好的教程:http://msdn.microsoft.com/en-us/library/bb387061.aspx

      【讨论】:

      • 我已经阅读了一些关于 LINQ to XML 的信息,它很有希望。为什么没有人会投票赞成这个答案?
      • 两个文件的 XSD 相同吗?
      • 愚蠢的问题:什么是 XSD?
      • 两个 xml 文件的架构是否相同? XSD 是模式的定义。更简单的说:每个文件的结构都一样吗?
      • 如果你的结构是指元素、属性等的顺序,那么这不是必需的,但可能会是一样的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多