У меня есть простой 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, код работает правильно.
Ваш элемент имеет пространство имен, потому что xmlns эффективно устанавливает пространство имен по умолчанию для этого элемента и его потомков.Попробуйте вместо этого:
xmlns
XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; IEnumerable<XElement> h = x.Descendants(ns + "H");
Обратите внимание, что Descendants не будет никогда возвращать ноль, поэтому условие в конце вашего кода бессмысленно.чтобы найти все H элементов независимо от пространства имен, вы можете использовать:
Descendants
H
var h = x.Descendants().Where(e => e.Name.LocalName == "H");
Просто хотел добавить к ответу Джона, что вы можете получить пространство имен следующим образом:
XNamespace ns = x.Name.Namespace
Тогда просто используйте это, как он предложил:
IEnumerable<XElement> h = x.Descendants(ns + "H");