首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XNode.DeepEquals认为自结束标记和结束标记是不同的

XNode.DeepEquals认为自结束标记和结束标记是不同的
EN

Stack Overflow用户
提问于 2017-05-23 17:22:55
回答 1查看 481关注 0票数 3

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

代码语言:javascript
复制
XNode node = XDocument.Parse("<Root/>");
XNode node2 = XDocument.Parse("<Root></Root>");

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

快跑

我假设"<Root/>"等同于"<Root></Root>",但是DeepEquals说它们不是(返回false)。

我如何比较这两份文件是相等的?

ps:不受XNode约束。使用XmlDocument的解决方案也很受欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-23 17:59:41

为了比较这两份文件是否相等,应在一定程度上加以规范。

Eric写了几篇博客文章,详细介绍了高级normalization1和简单的normalization2。

为了修复空标记和自结束标记,后一篇文章更相关。

从该条中:

静态XElement CloneElement(XElement元素){返回新的XElement(element.Name,element.Attributes(),element.Nodes().Select(n => { XElement e=n作为XElement;if (e = null)返回CloneElement(e);返回n;}) )

此代码将递归地将元素及其后缀复制为规范化形式(使用默认的XElement构造)。这包括将空标签规范化为自结束标记。然后,比较这些文档将如预期的那样工作。

考虑以下XML:

代码语言:javascript
复制
<Foo>
    <Bar/>
    <Root/>
</Foo>

代码语言:javascript
复制
<Foo>
    <Bar></Bar>
    <Root></Root>
</Foo>

在对每个元素使用CloneElement之后,它们将是相等的。

代码语言:javascript
复制
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:LINQ树的等价语义

2:空元素和自关闭标记

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44141289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档