使用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树不是。为什么?

最佳答案

我已经弄清楚了区别是什么,但不是为什么它与众不同。

在第一种形式中,您具有xmlns属性。在第二种形式中,您不需要-不用说Attributes()返回什么。如果您显式构造一个XAttributeDeepEquals将返回true:

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

基本上,好像 namespace 仅在将树转换为文本表示形式时才视为属性。

09-25 22:24