【问题标题】:How to Select XML Nodes with XML Namespaces from an XmlDocument?如何从 XmlDocument 中选择具有 XML 命名空间的 XML 节点?
【发布时间】:2011-01-08 08:39:16
【问题描述】:

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

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

【问题讨论】:

    标签: c# xml xmldocument xml-namespaces


    【解决方案1】:

    您必须先使用 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 = "";
        }
    }
    

    【讨论】:

    • +1 击败了我 - 完全正确,它是 XML 命名空间 - 我们正在处理的不是 XML 名称中带有冒号的标签在这里...
    • 完美运行。听说过 AddNamespace 命令,但无法确定第二个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2014-06-27
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多