2009-02-01 8 views
6

Ich versuche, einen Atom-Feed programmgesteuert zu analysieren. Ich habe das Atom XML als String heruntergeladen. Ich kann das XML in eine XmlDocument laden. Ich kann das Dokument jedoch nicht mit XPath durchqueren. Immer wenn ich es versuche, bekomme ich null.Keine Knoten ausgewählt aus Atom XML-Dokument mit XPath?

Ich habe mit diesem Atom-Feed als Test: http://steve-yegge.blogspot.com/feeds/posts/default

Aufruf SelectSingleNode() immer wieder null, außer wenn ich "/" verwenden. Hier ist, was ich versuche jetzt:

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); 
} 

Ich dachte, es wegen meiner XPath gewesen sein könnte, also habe ich auch versucht, eine einfache Abfrage des Root-Knotens, da ich die Wurzel wusste funktionieren sollte:

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

Egal was ich tue, es scheint, als ob es nichts auswählen kann. Offensichtlich vermisse ich etwas, ich kann einfach nicht herausfinden, was. Was muss ich tun, damit XPath mit diesem Atom-Feed funktioniert?

EDIT

Obwohl diese Frage eine Antwort hat, fand ich diese Frage duplizieren hat sich als eine fast exakte: SelectNodes not working on stackoverflow feed

+0

möglich Duplikat [Select nicht auf Stackoverflow-Feed Arbeits] (http://stackoverflow.com/questions/24734/selectnodes-not-working-on-stackoverflow-feed) –

Antwort

8

Während die C# -Implementierung Namespace Standard erlauben kann (ich weiß nicht,), die XPath 1.0-Spezifikation nicht. Also, geben "Atom" seinen eigenen Präfix:

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

Und Ihre XPath ändern sie entsprechend:

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

lädt XML aus einem String und Lookup für alle 'Fehler/Error' Knoten.

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

Verwandte Themen