使用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树不是。为什么呢?
答案 0 :(得分:5)
我已经找出 之间的区别,但为什么不同。
在第一种形式中,您有xmlns
属性。在第二种形式中,您不会 - 而不是Attributes()
返回的内容。如果明确构建XAttribute
,DeepEquals
将返回true
:
var xmlDirect = new XDocument(new XElement(
XNamespace.Get("someNamespace") + "someXml",
new XAttribute("xmlns", "someNamespace")));
在将树转换为文本表示时,就好像命名空间只计为属性一样。
答案 1 :(得分:0)
解析后你会得到一个 XDocument。尝试检索节点以在 DeepEqual 中使用它:
var xmlFromString = XDocument.Parse("
这为我解决了问题。