Как выбрать узлы XML с пространствами имен XML из XmlDocument? - PullRequest
11 голосов
/ 08 января 2011

мой код пытается получить данные из RSS-канала веб-сайта.Он хорошо захватывает узлы, но при попытке получить данные из узла с двоеточием сбой и выдает ошибку «Необходим диспетчер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или пользовательскую функцию».Код показан ниже:

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

Я понимаю, что мне нужно определить пространство имен, но я не уверен, как это сделать.Помощь будет оценена.

1 Ответ

19 голосов
/ 08 января 2011

Вы должны объявить префикс пространства имен dc, используя XmlNamespaceManager , прежде чем использовать его в выражениях 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 = "";
    }
}
...