XElement.Descendants无法与命名空间一起使用。

19

我有一个简单的XML文档,

<S xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><H></H></S>

我想找到所有的 "H" 节点。

XElement x = XElement.Parse("<S xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><H></H></S>");
IEnumerable<XElement> h = x.Descendants("H");
if (h != null)
{
}

但是这段代码无法正常工作。 当我从S标签中删除命名空间时,代码可以正常工作。


这个问题与WPF无关,顺便说一下... - Jon Skeet
2个回答

53

你的元素具有命名空间,因为 xmlns 实际上设置了该元素及其后代的默认命名空间。请尝试使用以下代码:

XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
IEnumerable<XElement> h = x.Descendants(ns + "H");
请注意, Descendants 永远不会返回null,因此您代码末尾的条件是无意义的。
如果您想找到所有命名空间无关的 H 元素,可以使用:
var h = x.Descendants().Where(e => e.Name.LocalName == "H");

8

我想补充一下Jon的回答,你可以按照以下方式获取命名空间:

XNamespace ns = x.Name.Namespace

那就按他提出的方法使用它:
IEnumerable<XElement> h = x.Descendants(ns + "H");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接