2009-02-01 5 views
6

Sto tentando di analizzare un feed Atom a livello di codice. Ho scaricato l'XML dell'atomo come una stringa. Posso caricare l'XML in un XmlDocument. Tuttavia, non posso attraversare il documento usando XPath. Ogni volta che provo, ottengo null.Nessun nodo selezionato dal documento XML Atom che utilizza XPath?

Sto usando questo feed Atom come un test: http://steve-yegge.blogspot.com/feeds/posts/default

Calling SelectSingleNode() restituisce sempre null, ad eccezione di quando uso "/". Qui è quello che sto provando in questo 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); 
} 

ho pensato che potrebbe essere stato a causa della mia XPath, così ho provato anche una semplice query del nodo principale da quando ho saputo che la radice dovrebbe funzionare:

// I've tried both with & without the nsMngr declared above 
XmlNode node = atom.SelectSingleNode("/feed"); 

Non importa quello che faccio, sembra che non possa selezionare nulla. Ovviamente mi manca qualcosa, non riesco a capire cosa. Che cosa devo fare per far funzionare XPath su questo feed Atom?

EDIT

Anche se questa domanda ha una risposta, ho scoperto questa domanda ha una quasi esatta duplicato: SelectNodes not working on stackoverflow feed

+0

possibile duplicato del [SelectNodes non lavorano su alimentazione StackOverflow] (http://stackoverflow.com/questions/24734/selectnodes-not-working-on-stackoverflow-feed) –

risposta

8

Mentre l'implementazione C# può consentire namespace di default (non so), le specifiche XPath 1.0 no. Quindi, dare "Atom" il proprio prefisso:

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

e cambiare la vostra XPath in modo appropriato:

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

Load XML da una stringa e di ricerca per eventuali 'errori/Errore' nodi.

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