c# - valor - No hay nodos seleccionados del documento XML de Atom con XPath?
selectsinglenode c# (2)
Si bien la implementación de C # puede permitir espacios de nombres predeterminados (no lo sé), la especificación XPath 1.0 no. Entonces, dale a "Atom" su propio prefijo:
nsMngr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
Y cambie su XPath apropiadamente:
XmlNode node = atom.SelectSingleNode("//atom:entry/atom:link/app:edited", nsMngr);
Estoy tratando de analizar programáticamente un feed Atom. Tengo el átomo XML descargado como una cadena. Puedo cargar el XML en un XmlDocument
. Sin embargo, no puedo atravesar el documento con XPath. Cada vez que lo intento, me sale null
.
He estado usando este feed Atom como una prueba: http://steve-yegge.blogspot.com/feeds/posts/default
Llamar a SelectSingleNode()
siempre devuelve null
, excepto cuando uso " /
". Esto es lo que estoy intentando en este momento:
using (WebClient wc = new WebClient())
{
string xml = wc.DownloadString("http://steve-yegge.blogspot.com/feeds/posts/default");
XmlNamespaceManager nsMngr = new XmlNamespaceManager(new NameTable());
nsMngr.AddNamespace(string.Empty, "http://www.w3.org/2005/Atom");
nsMngr.AddNamespace("app", "http://purl.org/atom/app#");
XmlDocument atom = new XmlDocument();
atom.LoadXml(xml);
XmlNode node = atom.SelectSingleNode("//entry/link/app:edited", nsMngr);
}
Pensé que podría deberse a mi XPath, así que también intenté una consulta simple del nodo raíz porque sabía que la raíz debería funcionar:
// I''ve tried both with & without the nsMngr declared above
XmlNode node = atom.SelectSingleNode("/feed");
No importa lo que haga, parece que no puede seleccionar nada. Obviamente me falta algo, simplemente no puedo entender qué. ¿Qué es lo que tengo que hacer para que XPath funcione en este feed Atom?
EDITAR
Aunque esta pregunta tiene una respuesta, descubrí que esta pregunta tiene un duplicado casi exacto: SelectNodes no funciona en la alimentación de stackoverflow
Cargue XML de una cadena y busque los nodos ''Errores / Error''.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlResult);
XmlNamespaceManager nm = new XmlNamespaceManager(xmlDoc.NameTable);
nm.AddNamespace("ns", "http://somedomain.com/namespace1/2"); //ns - any name, make sure it is same in the below line
XmlNodeList errors = xmlDoc.SelectNodes("/ns:*//ns:Errors/ns:Error", nm);
-Mathulan