当 xml 具有根节点的命名空间时,XElement 和 XName 崩溃

XElement and XName crashes when xml has namespace to root node

你好,我正在摆弄 xml 文件,我注意到一些问题我需要解决。

我有一个 Xml,它以根节点开头,然后有另一个可以更改名称的子节点,例如:

<root>
  <Child1>
</root>

所以鉴于 "Child1" 可以更改为 "Child2" 或 "Child3" 我让这个 linq 能够从我遇到的任何事情中提取名称。

第一个:

XElement root = XElement.Parse(xml);

var childType = root.Descendants().First(x => x.Name == "Child1" || x.Name == "Child2"|| x.Name == "Child3").Name;

所以当我的 xml 没有命名空间时,如上所示,它工作正常,我设法从节点标签中提取名称。

但是当我在根标签中有一个命名空间时,它会抛出一个错误:

<root xmlns="namespace">
  <Child1>
</root>

xml 通过相同的 linq,抛出:

Sequence contains no matching element

您的 root 元素定义了命名空间 (xmlns="namespace"),因此所有子元素都与同一命名空间相关联。 IE。 Child1 元素将在同一个命名空间中,其名称将同时包含命名空间前缀和本地名称 ("Child1")。因此,您可以在搜索 Child1 元素时指定全名:

var ns = root.GetDefaultNamespace();
var childType = root.Descendants()
   .First(x => x.Name == ns +"Child1" || x.Name == ns + "Child2"|| x.Name == ns + "Child3")
   .Name;

或者您可以查找 x.Name.LocalName(但我不推荐这种方法,尽管您不太可能从另一个名称空间获得 Child1 元素)。

注意:您的 Child 元素没有结束标记(可能是印刷错误)

进一步阅读:Xml Namespaces