Нет узлов, выбранных из XML-документа Atom с использованием XPath?
-
20-08-2019 - |
Вопрос
Я пытаюсь программно проанализировать поток Atom.У меня есть atom XML, загруженный в виде строки.Я могу загрузить XML-файл в XmlDocument
.Однако я не могу просмотреть документ с помощью XPath.Всякий раз, когда я пытаюсь, я получаю null
.
Я использовал этот Atom feed в качестве теста: 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, поэтому я также попробовал простой запрос к корневому узлу, поскольку знал, что root должен работать:
// I've tried both with & without the nsMngr declared above
XmlNode node = atom.SelectSingleNode("/feed");
Независимо от того, что я делаю, кажется, что он ничего не может выбрать.Очевидно, мне чего-то не хватает, я просто не могу понять, чего.Что мне нужно сделать, чтобы заставить XPath работать с этим каналом Atom?
Редактировать
Хотя на этот вопрос есть ответ, я обнаружил, что этот вопрос имеет почти точный дубликат: SelectNodes не работает в ленте stackoverflow
Решение
Хотя реализация C # может допускать пространства имен по умолчанию (я не знаю), спецификация XPath 1.0 этого не делает.Итак, дайте "Atom" его собственный префикс:
nsMngr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
И соответствующим образом измените свой XPath:
XmlNode node = atom.SelectSingleNode("//atom:entry/atom:link/app:edited", nsMngr);
Другие советы
Загрузите XML из строки и выполните поиск любых узлов 'Errors /Ошибка'.
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);
-Матулан