2011-08-29 29 views
14

Tengo un sencillo XML,XElement.Descendants no funciona con espacio de nombres

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

Quiero encontrar todos los nodos "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) 
{ 
} 

Pero este código no funciona. Cuando elimino el espacio de nombres de la etiqueta S, el código funciona correctamente.

+0

Esta pregunta no tiene nada que ver con WPF, por cierto ... –

+0

Gracias, eliminé la etiqueta "WPF". –

Respuesta

42

Su elemento tiene un espacio de nombre porque xmlns establece efectivamente el predeterminado espacio de nombres para ese elemento y sus descendientes. Tal vez puedas probar:

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

Tenga en cuenta que nunca se Descendants se nula rentabilidad, por lo que la condición al final de su código no tiene sentido.

Si usted quiere encontrar todosH elementos independientemente del espacio de nombres, se puede utilizar:

var h = x.Descendants().Where(e => e.Name.LocalName == "H"); 
+0

Gracias y saludos cordiales. –

6

sólo quería añadir a la respuesta de Jon que se puede obtener el espacio de nombres como esto:

XNamespace ns = x.Name.Namespace 

A continuación, sólo usarlo como propuso:

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