使用Xpath从XmlNode获取Element

时间:2015-04-02 12:50:31

标签: c# xml xpath xmldocument

我试图获取此xml Feed中每个条目的标题和链接

https://www.businessopportunities.ukti.gov.uk/alertfeed/businessopportunities.rss

设置断点我可以看到我收到所有条目但是当我尝试从条目中获取标题或链接时出现错误

XmlDocument rssXmlDoc = new XmlDocument();
rssXmlDoc.Load("https://www.businessopportunities.ukti.gov.uk/alertfeed/businessopportunities.rss");
var nsm = new XmlNamespaceManager(rssXmlDoc.NameTable);
nsm.AddNamespace("atom", "http://www.w3.org/2005/Atom");

XmlNodeList entries = rssXmlDoc.SelectNodes("/atom:feed/atom:entry", nsm);


foreach (XmlNode entry in entries)
{
    var title = entry.SelectSingleNode("/atom:entry/atom:title", nsm).InnerText;
    var link = entry.SelectSingleNode("/atom:entry/atom:link", nsm).InnerText;
}

1 个答案:

答案 0 :(得分:1)

在XPath表达式中,前导/表示应从文档的 root 节点开始计算表达式。这种表达式称为绝对路径表达式。你的第一个表达:

/atom:feed/atom:entry

从根开始评估,但所有后续表达式都不应该。像

这样的表达式
/atom:entry/atom:title

装置

  

从文档的根节点开始,然后查找最外面的元素atom:entry,然后选择名为atom:title的子元素。

但显然,atom:entry不是文档的最外层元素。

只需更改

var title = entry.SelectSingleNode("/atom:entry/atom:title", nsm).InnerText;
var link = entry.SelectSingleNode("/atom:entry/atom:link", nsm).InnerText;

var title = entry.SelectSingleNode("atom:title", nsm).InnerText;
var link = entry.SelectSingleNode("atom:link", nsm).InnerText;