c# - 如何从 XmlDocument 中选择具有 XML 命名空间的 XML 节点?

标签 c# xml xmldocument xml-namespaces

我的代码试图从网站的 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 = "";
   }
}

我知道我需要定义命名空间,但不确定如何操作。帮助将不胜感激。

最佳答案

您必须使用 XmlNamespaceManager 声明 dc 命名空间前缀在 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 = "";
    }
}

关于c# - 如何从 XmlDocument 中选择具有 XML 命名空间的 XML 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4633127/

相关文章:

c++ - 用于 2D RPG 的 XML vs YAML vs JSON

c# - 单个xpath表达式获取一些属性

c# XmlDocument SelectNodes 不返回节点

c# - MVC4 捆绑(基于设备类型)

html - 在 XPath 中将货币与美元符号 ($) 和逗号 (,) 匹配

c# - 绑定(bind)列表和 LINQ?

xml - 具有多个命名空间的 VBA SelectSingleNode xpath

java - 如何解析具有相同名称但位于不同父级下的两个节点?

c# - 重用 WebClient 对象发送另一个 HTTP 请求

c# - Windows Azure 上的作业队列设计