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

时间:2017-06-30 15:31:59

标签: c# xml linq xelement

嗨我正在摆弄xml文件,我注意到了一些我有点解决问题的方法。

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

<root>
  <Child1>
</root>

因此,#34; Child1&#34;可以更改为&#34; Child2&#34;或者&#34; Child3&#34;我让这个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,抛出:

  

序列不包含匹配元素

1 个答案:

答案 0 :(得分:2)

您的root元素定义了一个名称空间(xmlns="namespace"),因此所有子元素都与同一名称空间相关联。即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