2015-04-02 6 views
0

Я пытаюсь получить заголовок и ссылку каждой записи в этом XML FeedИспользование Xpath, чтобы получить элемент из XmlNode

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

В выражении XPath, ведущий / указывает на то, что выражение следует оценивать исходя из корня узел документа. Такое выражение называется абсолютным признаком пути. Ваше первое выражение:

/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; 
Смежные вопросы