2009-02-01 23 views
6

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, obtengo null.No Nodes ¿Se seleccionó del documento XML Atom usando XPath?

He estado usando este feed Atom como una prueba: http://steve-yegge.blogspot.com/feeds/posts/default

Calling SelectSingleNode() siempre devuelve null, a excepción de cuando se utiliza "/". Aquí es lo que estoy tratando 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 haber sido debido a mi XPath, así que también he intentado una simple consulta del nodo raíz ya que sabía 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í esta pregunta tiene una casi exacta duplicado: SelectNodes not working on stackoverflow feed

+0

posible duplicado de [SelectNodes no trabajan en alimentación stackoverflow] (http://stackoverflow.com/questions/24734/selectnodes-not-working-on-stackoverflow-feed) –

Respuesta

8

Mientras que el C# aplicación puede permitir espacios de nombres por defecto (no sé), la especificación XPath 1.0 no. Por lo tanto, dar "Atom" su propio prefijo:

nsMngr.AddNamespace("atom", "http://www.w3.org/2005/Atom"); 

y cambiar su forma apropiada XPath:

XmlNode node = atom.SelectSingleNode("//atom:entry/atom:link/app:edited", nsMngr); 
0

Cargar XML de una cadena y la búsqueda de cualquier error Errores '/' nodos.

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

Cuestiones relacionadas