嗨我正在摆弄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,抛出:
序列不包含匹配元素
答案 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