如何从XmlDocument中selectXML命名空间的XML节点?
我的代码尝试从网站的RSS提要中获取数据。 它抓取的节点很好,但是当试图用冒号从一个节点获取数据时,它会崩溃,并给出错误“名称空间pipe理器或XsltContext需要,这个查询有一个前缀,variables或用户定义的函数。 代码如下所示:
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
命名空间前缀,然后才能在XPathexpression式中使用它:
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 = ""; } }