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.