2009-02-01 1 views
6

Я пытаюсь анализировать канал Atom программно. У меня есть XML-XML, загруженный в виде строки. Я могу загрузить XML в XmlDocument. Однако я не могу пройти документ, используя XPath. Всякий раз, когда я пытаюсь, я получаю null.Нет узлов, выбранных из XML-документа Atom, используя XPath?

Я использую этот канал 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

Хотя этот вопрос есть ответ, я узнал, что этот вопрос имеет почти точный дубликат: SelectNodes not working on stackoverflow feed

+0

возможно дубликат [SelectNodes не работает на StackOverflow сырье] (http://stackoverflow.com/questions/24734/selectnodes-not-working-on-stackoverflow-feed) –

ответ

8

В то время как 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

Загрузка XML из строки и поиска для всех 'Ошибки/Error' узлов.

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);  

-Mathulan