2011-01-08 12 views
11

mój kod próbuje pobrać dane z kanału RSS witryny. Łączy ona węzły w porządku, ale przy próbie przechwycenia danych z węzła za pomocą dwukropka, zawiesza się i podaje błąd "Namespace Manager lub XsltContext potrzebne.To zapytanie ma prefiks, zmienną lub funkcję zdefiniowaną przez użytkownika." Kod jest pokazany poniżej:Jak wybrać węzły XML z obszarami nazw XML z XmlDocument?

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 = ""; 
    } 
} 

Rozumiem, że muszę zdefiniować przestrzeń nazw, ale nie jestem pewien, jak to zrobić. Pomoc byłaby doceniona.

Odpowiedz

19

Musisz zadeklarować prefiks dc przestrzeni nazw za pomocą XmlNamespaceManager, zanim będzie można go używać w wyrażeniach XPath:

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 pokonać mnie do niego - to jest dokładnie to prawo, to przestrzenie nazw XML ** ** - nie * Znaczniki XML z dwukropkami w nazwie *, z którymi mamy tu do czynienia ... –

+0

Działa doskonale. Usłyszałem o poleceniu AddNamespace, ale miałem problem z ustaleniem drugiego parametru. – Sticky

+0

@marc_s, dostosował tytuł. – Sticky

Powiązane problemy