Я пытаюсь выбрать узлы из RSS-канала. Он отлично работает для Twitter, но я не могу сделать это на Youtube.
string youtube = "http://gdata.youtube.com/feeds/api/users/CTVOlympics/uploads"; string twitter = "http://twitter.com/statuses/user_timeline/ctvolympics.rss"; //this populates the XmlNodeList object XmlTextReader readerTwitter = new XmlTextReader(twitter); XmlDocument docTwitter = new XmlDocument(); docTwitter.Load(readerTwitter); XmlNodeList nodesTwitter = docTwitter.SelectNodes("/rss/channel/item"); //this doesn't populate the object XmlTextReader readerYoutube = new XmlTextReader(youtube); XmlDocument docYoutube = new XmlDocument(); docYoutube.Load(readerYoutube); XmlNodeList nodesYoutube = docYoutube.SelectNodes("/feed/entry");
есть идеи?
Вы пытаетесь выбрать узел 'entry' в пустом пространстве имен, тогда как вы должны пытаться выбрать узел 'entry' в пространстве имен 'http://www.w3.org/2005/Atom'.
Вы можете использовать XMLNamespaceManager, чтобы указать пространство имен по умолчанию:
XMLNamespaceManager
XmlNamespaceManager nsmanager = new XmlNamespaceManager(docYoutube.NameTable); nsmanager.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");
или вы можете использовать "/*[local-name()='feed']/*[local-name()='entry']"
"/*[local-name()='feed']/*[local-name()='entry']"
Если вы хотите визуализировать результат запросов XPath, вы можете использовать XpathVisualizer . Это инструмент WinForms. Загрузите XML-документ, который вы хотите запросить, введите запрос, просмотрите результаты.
Free. Открытый исходный код.
Укажите пространство имен.
Попробуйте: "/*[local-name()='feed']/*[local-name()='entry']"
string youtube = "http://gdata.youtube.com/feeds/api/users/CTVOlympics/uploads"; string twitter = "http://twitter.com/statuses/user_timeline/ctvolympics.rss"; //this populates the XmlNodeList object XmlDocument docTwitter; using (var readerTwitter = XmlReader.Create(twitter)) { docTwitter = new XmlDocument(); docTwitter.Load(readerTwitter); } XmlNodeList nodesTwitter = docTwitter.SelectNodes("/rss/channel/item"); //this doesn't populate the object XmlDocument docYoutube; using (var readerYoutube = XmlReader.Create(youtube)) { docYoutube = new XmlDocument(); docYoutube.Load(readerYoutube); } XmlNamespaceManager ns = new XmlNamespaceManager(docYoutube.NameTable); ns.AddNamespace("atom", "http://www.w3.org/2005/Atom"); XmlNodeList nodesYoutube = docYoutube.SelectNodes("/atom:feed/atom:entry", ns);
Попробуйте найти причину проблемы, используя // вместо /. Итак, что-то вроде // ввода моей работы лучше, так как это приведет к глубине поиска вашего запроса.
Но мой вопрос заключается в том, действительно ли этот запрос XPath извлекает что-либо.
Если это не приводит к ошибке, то это должно быть потому, что xml-документ не содержит <feed> -элемента или <entry> элементов с <feed> -родителем.
<feed>
<entry>