【问题标题】:XNode.DeepEquals considers selfclosing tags and closing tags as differentXNode.DeepEquals 认为自闭合标签和闭合标签是不同的
【发布时间】:2017-05-24 02:06:18
【问题描述】:

我想比较两个 xml 文档是否相等。我的一份文件有自动关闭标签,而另一份没有。

XNode node = XDocument.Parse("<Root/>");
XNode node2 = XDocument.Parse("<Root></Root>");

bool result = XNode.DeepEquals(node, node2);
Console.WriteLine(result);

Run it quickly

我假设"&lt;Root/&gt;" 等同于"&lt;Root&gt;&lt;/Root&gt;" 但是DeepEquals 说它们不是(返回false)。

如何比较这两个文档是否相等?

ps:不受XNode 的限制。也欢迎使用XmlDocument 的解决方案。

【问题讨论】:

标签: c# .net xml


【解决方案1】:

为了比较两个文档的相等性,它们应该在某种程度上进行规范化。

Eric White 发表了几篇博文,详细介绍了高级规范化 [1] 和简单规范化 [2]。

要修复空标签与自闭合标签,后一篇文章更相关。

来自文章:

static XElement CloneElement(XElement element)
{
    return new XElement(element.Name,
        element.Attributes(),
        element.Nodes().Select(n =>
        {
            XElement e = n as XElement;
            if (e != null)
                return CloneElement(e);
            return n;
        })
    );
}

此代码将递归地复制一个元素及其子元素到一个规范化的形式(使用默认的 XElement 构造)。这包括将空标签规范化为自闭合标签。然后比较文档将按预期进行。

考虑以下 XML:

<Foo>
    <Bar/>
    <Root/>
</Foo>

<Foo>
    <Bar></Bar>
    <Root></Root>
</Foo>

在每个元素上使用CloneElement 后,它们将相等。

var node = XElement.Parse("<Foo><Bar/><Root/></Foo>");
var node2 = XElement.Parse("<Foo><Bar></Bar><Root></Root></Foo>");

XElement.DeepEquals(node, node2); // False
XElement.DeepEquals(CloneElement(node), CloneElement(node2)); // True

[1]:Equality Semantics of LINQ to XML Trees

[2]:Empty Elements and Self-Closing Tags

【讨论】:

  • 感谢您的回答。不知道我在找到this 时是如何错过这些帖子的。
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多