2011-01-08 10 views
11

mein Code versucht, Daten aus dem RSS-Feed einer Website zu greifen. Es ergreift die Knoten fein, aber wenn versucht wird, die Daten von einem Knoten mit einem Doppelpunkt abzurufen, stürzt es ab und gibt den Fehler "Namespace Manager oder XsltContext erforderlich. Diese Abfrage hat ein Präfix, eine Variable oder eine benutzerdefinierte Funktion." Der Code ist unten dargestellt:So wählen Sie XML-Knoten mit XML-Namespaces aus einem XmlDocument aus?

WebRequest request = WebRequest.Create("http://buypoe.com/external.php?type=RSS2&lastpost=true"); 
WebResponse response = request.GetResponse(); 

StringBuilder sb = new StringBuilder(""); 
System.IO.StreamReader rssStream = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8")); 

XmlDocument rssDoc = new XmlDocument(); 
rssDoc.Load(rssStream); 

XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); 

for (int i = 0; i < 5; i++) 
{ 
    XmlNode rssDetail; 
    rssDetail = rssItems.Item(i).SelectSingleNode("dc:creator"); 

    if (rssDetail != null) 
    { 
     user = rssDetail.InnerText; 
    } 
    else 
    { 
     user = ""; 
    } 
} 

Ich verstehe, dass ich den Namensraum definieren müssen, aber ich bin nicht sicher, wie dies zu tun. Hilfe wäre willkommen.

Antwort

19

Sie haben die dc Namespacepräfix erklären eine XmlNamespaceManager verwenden, bevor Sie es in XPath-Ausdrücken verwenden können:

XmlDocument rssDoc = new XmlDocument(); 
rssDoc.Load(rssStream); 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(rssDoc.NameTable); 
nsmgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/"); 

XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); 
for (int i = 0; i < 5; i++) { 
    XmlNode rssDetail = rssItems[i].SelectSingleNode("dc:creator", nsmgr); 
    if (rssDetail != null) { 
     user = rssDetail.InnerText; 
    } else { 
     user = ""; 
    } 
} 
+0

+1 schlug mich zu ihm - das ist genau richtig, es ist ** XML-Namespaces ** - nicht * XML-Tags mit Doppelpunkten in ihrem Namen * mit denen wir es hier zu tun haben ... –

+0

Perfekt gearbeitet. Hatte von dem AddNamespace-Befehl gehört, hatte aber Schwierigkeiten, den zweiten Parameter herauszufinden. – Sticky

+0

@marc_s, den Titel angepasst. – Sticky