Tengo un XDocument
objeto Quiero consultar elementos con un nombre particular a cualquier profundidad usando LINQ. Cuando uso Descendants("element_name")
, solo obtengo elementos que son hijos directos del nivel actual. Lo que estoy buscando es el equivalente de "// element_name" en XPath ... ¿debería usarlo XPath
, o hay alguna forma de hacerlo utilizando los métodos LINQ? Gracias.
143
doc.Descendants("Cars").Descendants("Part")
(o posiblemente.Elements("Part")
si solo fueran niños directos.)var foo = new XDocument().Descendants("Bar").Descendants("Baz");
porqueDescendants
devuelve un vacíoIEnumerable<XElement>
y nonull
.Un ejemplo que indica el espacio de nombres:
fuente
Puedes hacerlo de esta manera:
donde
xml
esta aXDocument
.Tenga en cuenta que la propiedad
Name
devuelve un objeto que tiene ayLocalName
aNamespace
. Es por eso que debe usarName.LocalName
si desea comparar por nombre.fuente
Los descendientes harán exactamente lo que necesita, pero asegúrese de haber incluido un nombre de espacio de nombres junto con el nombre del elemento. Si lo omite, probablemente obtendrá una lista vacía.
fuente
Hay dos maneras de lograr esto,
Los siguientes son ejemplos del uso de estos enfoques,
Si usa XPath, necesita hacer alguna manipulación con IEnumerable:
Tenga en cuenta que
da como resultado un puntero nulo o ningún resultado.
fuente
XPathEvaluate
está en elSystem.Xml.XPath
espacio de nombres.Estoy usando el
XPathSelectElements
método de extensión que funciona de la misma manera que elXmlDocument.SelectNodes
método:fuente
Siguiendo la respuesta de @Francisco Goldenstein, escribí un método de extensión
fuente
Sabemos que lo anterior es cierto. Jon nunca se equivoca; los deseos de la vida real pueden ir un poco más allá
Por ejemplo, por lo general el problema es, ¿cómo podemos obtener EchoToken en el documento xml anterior? O cómo desenfocar el elemento con el nombre atribuir.
1- Puede encontrarlos accediendo con el espacio de nombres y el nombre como se muestra a continuación
2- Puedes encontrarlo por el valor del contenido del atributo, como este
fuente
Esta es mi variante de la solución basada en el
Linq
método de descendientes de laXDocument
claseResultados:
Para más detalles sobre el
Desendants
método, eche un vistazo aquí.fuente
(El código y las instrucciones son para C # y es posible que deba modificarse ligeramente para otros idiomas)
Este ejemplo funciona perfecto si desea leer de un nodo primario que tiene muchos hijos, por ejemplo, mire el siguiente XML;
Ahora con este código a continuación (teniendo en cuenta que el archivo XML se almacena en recursos (consulte los enlaces al final del fragmento para obtener ayuda sobre los recursos)) Puede obtener cada dirección de correo electrónico dentro de la etiqueta "correos electrónicos".
Resultados
Nota: Para la aplicación de consola y WPF o Windows Forms, debe agregar "using System.Xml.Linq;" Directiva de uso en la parte superior de su proyecto, para la consola también deberá agregar una referencia a este espacio de nombres antes de agregar la directiva de uso. Además, para la consola no habrá un archivo de recursos de forma predeterminada en la "Carpeta de propiedades", por lo que debe agregar manualmente el archivo de recursos. Los siguientes artículos de MSDN explican esto en detalle.
Agregar y editar recursos
Cómo: Agregar o quitar recursos
fuente