当 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
你好,我正在摆弄 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