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

C# 当xml具有根节点的命名空间时,XElement和XName崩溃,c#,xml,linq,xelement,C#,Xml,Linq,Xelement,嗨,我在摆弄xml文件,我注意到了一些我有点问题要解决的事情 我有一个Xml,它以根节点开始,然后有另一个子节点,可以更改名称,例如: <root> <Child1> </root> 因此,当我的xml没有名称空间时,如上所示,它工作得很好,我设法从节点标记中提取名称 但是,当我将名称空间放入根标记时,它会抛出一个错误: <root xmlns="namespace"> <Child1> </root> 通过

嗨,我在摆弄xml文件,我注意到了一些我有点问题要解决的事情

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

<root>
  <Child1>
</root>
因此,当我的xml没有名称空间时,如上所示,它工作得很好,我设法从节点标记中提取名称

但是,当我将名称空间放入根标记时,它会抛出一个错误:

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

通过相同linq的xml抛出:

序列不包含匹配元素


您的
元素定义了一个名称空间(
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
元素)

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


进一步阅读:

可能值得解释的是,这是由于使用
xmlns=…
默认名称空间造成的。我本来打算这么做的,但我想这基本上是你答案的复制品……这非常有效,正是我想要的答案,谢谢。
var ns = root.GetDefaultNamespace();
var childType = root.Descendants()
   .First(x => x.Name == ns +"Child1" || x.Name == ns + "Child2"|| x.Name == ns + "Child3")
   .Name;