valor obtener nodo net leer especifico c# xml xpath xsd xml-namespaces

c# - obtener - ¿Cómo selecciono los nodos que usan un espacio de nombres predeterminado?



xpath c# (2)

La estructura del archivo XML es más o menos de la siguiente manera:

<?xml version="1.0" encoding="UTF-8"?> <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="url1" xsi:schemaLocation="url2 url3"> <b> <c></c> <c></c> <c></c> </b> </a>

Mi objetivo es seleccionar todos los elementos "c", pero la siguiente expresión xpath no funcionará: "// a / b / c".

es decir:

XmlDocument doc= new XmlDocument(); doc.Load(filepath); XmlNodeList l = doc.SelectNodes("//a/b/c"); // 0 nodes

Las únicas expresiones xpath que probé que funcionaron son / * (1 nodo) y // * (todos los nodos).

¿Este problema está relacionado con el espacio de nombres XML? Si es así, ¿cuál es la forma correcta de configurar el objeto XMLDocument?

XmlDocument doc= new XmlDocument(); doc.Load(filepath); XmlNamespaceManager m = new XmlNamespaceManager(doc.NameTable); m.AddNamespace(/* what goes here? */); XmlNodeList l = doc.SelectNodes("//a/b/c", m);


La pregunta es ambigua ... si necesitas obtener todas las etiquetas C usa esto:

XmlNodeList list = doc.GetElementsByTagName("c");

Si necesita definir un patrón en su lugar, use esto:

XmlNodeList list = doc.SelectNodes("/a/b//c", m);


Debe asignar un prefijo de espacio de nombres para el espacio de nombres predeterminado que usa el documento y luego usarlo en su XPath:

XmlDocument doc= new XmlDocument(); doc.Load(filepath); XmlNamespaceManager m = new XmlNamespaceManager(doc.NameTable); m.AddNamespace("myns", "url1"); XmlNodeList l = doc.SelectNodes("/myns:a/myns:b/myns:c", m);

Puede reemplazar el prefijo "myns" con prácticamente cualquier cosa (alfanumérico sin espacios), siempre que sea coherente entre la línea 4 y el XPath, y que esté correctamente asignado al espacio de nombres "url1" en la línea 4.