Что не так с этим запросом XPath? - PullRequest
1 голос
/ 16 февраля 2010

Я пытаюсь выбрать узлы из 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");

есть идеи?

Ответы [ 7 ]

3 голосов
/ 16 февраля 2010

Вы пытаетесь выбрать узел 'entry' в пустом пространстве имен, тогда как вы должны пытаться выбрать узел 'entry' в пространстве имен 'http://www.w3.org/2005/Atom'.

Вы можете использовать XMLNamespaceManager, чтобы указать пространство имен по умолчанию:

XmlNamespaceManager nsmanager = new XmlNamespaceManager(docYoutube.NameTable);
nsmanager.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");

или вы можете использовать "/*[local-name()='feed']/*[local-name()='entry']"

1 голос
/ 16 февраля 2010

Если вы хотите визуализировать результат запросов XPath, вы можете использовать XpathVisualizer . Это инструмент WinForms. Загрузите XML-документ, который вы хотите запросить, введите запрос, просмотрите результаты.

alt text

Free. Открытый исходный код.

1 голос
/ 16 февраля 2010

Укажите пространство имен.

0 голосов
/ 04 октября 2011

Попробуйте: "/*[local-name()='feed']/*[local-name()='entry']"

0 голосов
/ 17 февраля 2010
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);
0 голосов
/ 16 февраля 2010

Попробуйте найти причину проблемы, используя // вместо /. Итак, что-то вроде // ввода моей работы лучше, так как это приведет к глубине поиска вашего запроса.

Но мой вопрос заключается в том, действительно ли этот запрос XPath извлекает что-либо.

0 голосов
/ 16 февраля 2010

Если это не приводит к ошибке, то это должно быть потому, что xml-документ не содержит <feed> -элемента или <entry> элементов с <feed> -родителем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...