Нет узлов, выбранных из документа Atom XML с использованием XPath? - PullRequest
6 голосов
/ 01 февраля 2009

Я пытаюсь проанализировать фид Atom программно. У меня есть атом XML, загруженный в виде строки. Я могу загрузить XML в XmlDocument. Тем не менее, я не могу пройти документ с помощью XPath. Всякий раз, когда я пытаюсь, я получаю null.

Я использовал этот канал Atom в качестве теста: http://steve -yegge.blogspot.com / feeds / posts / default

Вызов SelectSingleNode() всегда возвращает null, за исключением случаев, когда я использую "/". Вот что я сейчас пытаюсь:

using (WebClient wc = new WebClient())
{
    string xml = wc.DownloadString("http://steve-yegge.blogspot.com/feeds/posts/default");
    XmlNamespaceManager nsMngr = new XmlNamespaceManager(new NameTable());
    nsMngr.AddNamespace(string.Empty, "http://www.w3.org/2005/Atom");
    nsMngr.AddNamespace("app", "http://purl.org/atom/app#");
    XmlDocument atom = new XmlDocument();
    atom.LoadXml(xml);
    XmlNode node = atom.SelectSingleNode("//entry/link/app:edited", nsMngr);
}

Я думал, что это могло быть из-за моего XPath, поэтому я также попробовал простой запрос корневого узла, так как знал, что рут должен работать:

// I've tried both with & without the nsMngr declared above
XmlNode node = atom.SelectSingleNode("/feed");

Неважно, что я делаю, кажется, что он ничего не может выбрать. Очевидно, я что-то упустил, я просто не могу понять, что. Что мне нужно сделать, чтобы заставить XPath работать с этим фидом Atom?

EDIT

Хотя на этот вопрос есть ответ, я обнаружил, что этот вопрос имеет почти точную копию: Узлы SelectNode не работают с фидом stackoverflow

Ответы [ 2 ]

8 голосов
/ 01 февраля 2009

Хотя реализация C # может разрешать пространства имен по умолчанию (я не знаю), спецификация XPath 1.0 этого не делает. Итак, дайте «Атому» собственный префикс:

nsMngr.AddNamespace("atom", "http://www.w3.org/2005/Atom");

И соответственно измените свой XPath:

XmlNode node = atom.SelectSingleNode("//atom:entry/atom:link/app:edited", nsMngr);
0 голосов
/ 22 марта 2012

Загрузка XML из строки и поиск любых узлов «Ошибки / Ошибки».

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlResult);            
XmlNamespaceManager nm = new XmlNamespaceManager(xmlDoc.NameTable);
nm.AddNamespace("ns", "http://somedomain.com/namespace1/2"); //ns - any name, make sure it is same in the below line

XmlNodeList errors = xmlDoc.SelectNodes("/ns:*//ns:Errors/ns:Error", nm);       

-Матулан

...