XElement.Descendants не работает с пространством имен - PullRequest
16 голосов
/ 29 августа 2011

У меня есть простой 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, код работает правильно.

Ответы [ 2 ]

45 голосов
/ 29 августа 2011

Ваш элемент имеет пространство имен, потому что xmlns эффективно устанавливает пространство имен по умолчанию для этого элемента и его потомков.Попробуйте вместо этого:

XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
IEnumerable<XElement> h = x.Descendants(ns + "H");

Обратите внимание, что Descendants не будет никогда возвращать ноль, поэтому условие в конце вашего кода бессмысленно.чтобы найти все H элементов независимо от пространства имен, вы можете использовать:

var h = x.Descendants().Where(e => e.Name.LocalName == "H");
6 голосов
/ 20 марта 2014

Просто хотел добавить к ответу Джона, что вы можете получить пространство имен следующим образом:

XNamespace ns = x.Name.Namespace

Тогда просто используйте это, как он предложил:

IEnumerable<XElement> h = x.Descendants(ns + "H");
...