gpt4 book ai didi

c# - XNode.DeepEquals 认为自闭合标签和闭合标签是不同的

转载 作者:数据小太阳 更新时间:2023-10-29 02:33:36 26 4
gpt4 key购买 nike

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

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

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

Run it quickly

我假设 "<Root/>"相当于"<Root></Root>"然而DeepEquals说他们不是(返回假)。

我怎样才能比较这两个文档是否相等?

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

最佳答案

要比较两个文档是否相等,应该在某种程度上对其进行归一化。

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

关于c# - XNode.DeepEquals 认为自闭合标签和闭合标签是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44141289/

26 4 0