XNode.DeepEquals意外返回false

时间:2014-06-11 07:07:51

标签: c# .net xml linq-to-xml

使用XNode.DeepEquals()来比较xml元素,它意外地在两个我认为应该等效的xml文档上返回false

实施例

var xmlFromString = XDocument.Parse("<someXml xmlns=\"someNamespace\"/>");
var xmlDirect = new XDocument(new XElement(
  XNamespace.Get("someNamespace") + "someXml"));

Console.WriteLine(xmlFromString.ToString());
Console.WriteLine(xmlDirect.ToString());
Console.WriteLine(XNode.DeepEquals(xmlFromString, xmlDirect));
Console.WriteLine(xmlFromString.ToString() == xmlDirect.ToString());

输出

<someXml xmlns="someNamespace" />
<someXml xmlns="someNamespace" />
False
True

字符串被认为是相同的,但XML树不是。为什么呢?

2 个答案:

答案 0 :(得分:5)

我已经找出 之间的区别,但为什么不同。

在第一种形式中,您有xmlns属性。在第二种形式中,您不会 - 而不是Attributes()返回的内容。如果明确构建XAttributeDeepEquals将返回true

var xmlDirect = new XDocument(new XElement(
  XNamespace.Get("someNamespace") + "someXml",
  new XAttribute("xmlns", "someNamespace")));

在将树转换为文本表示时,就好像命名空间只计为属性一样。

答案 1 :(得分:0)

解析后你会得到一个 XDocument。尝试检索节点以在 DeepEqual 中使用它:

var xmlFromString = XDocument.Parse("").Root;

这为我解决了问题。