2011-01-08 16 views
11

mi código intenta capturar datos de la fuente RSS de un sitio web. Captura los nodos bien, pero cuando intenta capturar los datos de un nodo con dos puntos, se bloquea y muestra el error "Namespace Manager o XsltContext needed. Esta consulta tiene un prefijo, variable o función definida por el usuario". El código se muestra a continuación:Cómo seleccionar nodos XML con espacios de nombres XML de un 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 = ""; 
    } 
} 

entiendo que necesito para definir el espacio de nombres, pero estoy seguro de cómo hacer esto. La ayuda sería apreciada

Respuesta

19

Usted tiene que declarar el prefijo de espacio de nombres dc utilizando un XmlNamespaceManager antes de poder utilizarlo en las expresiones 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 Me golpearon a él - eso es exactamente correcto, es ** ** espacios de nombres XML - no * Etiquetas XML con dos puntos en su nombre * que estamos tratando aquí ... –

+0

Funcionó perfectamente. Había escuchado sobre el comando AddNamespace pero estaba teniendo problemas para descifrar el segundo parámetro. – Sticky

+0

@marc_s, ajustó el título. – Sticky

Cuestiones relacionadas