如何从XmlDocument中选择带有XML命名空间的XML节点?

11

我的代码试图从一个网站的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个回答

21

在XPath表达式中使用dc前,你需要使用XmlNamespaceManager来声明dc命名空间的前缀:

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

+1 你比我更快 - 很对,我们在这里处理的是 XML 命名空间 而不是 带有冒号的 XML 标签名称 ... - marc_s
运行得非常完美。之前听说过AddNamespace命令,但一直无法弄清第二个参数是什么。 - Sticky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接