Обработка RSS-каналов с пространствами имен в Android - PullRequest
2 голосов
/ 23 апреля 2010

Я пытаюсь написать синтаксический анализатор XML, который принимает RSS-канал и получает URL-адреса изображений, отображаемые в атрибуте url тега <media:thumbnail> Все это делается через android.Util.Xml, и является адаптацией кода, показанного здесь . Примером RSS-канала, который я пытаюсь использовать, является BBC News RSS-лента .

Однако media является дополнительным пространством имен и (возможно), в результате мой синтаксический анализатор не работает должным образом.

Ниже приведена версия моего метода синтаксического анализа. Есть ли какой-либо (без сомнения, простой) способ заставить мой список URL-адресов изображений работать?

public List<string> parse() {
    URL feedUrl = new URL("http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml");

    InputStream feedStream;

    try {
        feedStream = feedUrl.openConnection().getInputStream();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }              

    final List<string> ret = new ArrayList<string>();

    RootElement root = new RootElement("rss");
    Element channel = root.getChild("channel");
    Element item = channel.getChild("item");

    item.getChild("media", "thumbnail").getChild("url").setEndTextElementListener(new EndTextElementListener() {
        public void end(String body) {
            ret.add(body);
        }
    });

    try {
        Xml.parse(feedStream, Xml.Encoding.UTF_8, root.getContentHandler());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return ret;
}

Ответы [ 3 ]

5 голосов
/ 11 августа 2010

Один из способов, с помощью которых я обнаружил, что анализатор Xml (на Froyo 2.2) работает с префиксами пространства имен, - это указание URL-адреса пространства имен в качестве первого параметра для вызова item.getChild ().Например, если ваш xml выглядит следующим образом, ваш код может использовать URL-адрес xmlns в качестве первого параметра.

<?xml version="1.0" encoding="utf-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sample="http://www.example_web_site_here.com/dtds/sample_schema.dtd" version="2.0">
    <channel><item><sample:duration>1:00:00</sample:duration></item></channel></rss>

Настройка вашего слушателя будет выглядеть так, чтобы получить текст элемента duration:

 item.getChild("http://www.example_web_site_here.com/dtds/sample_schema.dtd", "duration").setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                this.itemDuration = body;
            } });

Требуется знание пространства имен, но оно работает для меня.В моем случае я знаю пространство имен.

0 голосов
/ 14 февраля 2011

Я бы не рекомендовал пытаться реализовать свой собственный парсер RSS, а вместо этого использовал бы стандартную библиотеку для этого.

Вам нужно обслуживать все форматы RSS 1, RSS 2, Atom и т. Д. Даже в этом случае вам придется бороться с плохо отформатированными каналами.

В прошлом я сталкивался с подобными проблемами, поэтому решил выполнить мой анализ каналов на сервере и просто получить проанализированный контент. Это позволяет мне запускать более сложные библиотеки и синтаксический анализатор, которые я могу изменять, не отправляя обновления для моего приложения. Вы действительно должны стремиться к тому, чтобы ваше приложение было легким и выжимало из него как можно больше логики (на ваш собственный сервер).

У меня есть следующая служба, работающая в AppEngine, которая позволяет намного проще анализировать XML / JSON на вашем конце. Существует фиксированная и простая структура ответа. Вы можете использовать это для разбора

http://evecal.appspot.com/feedParser

Вы можете отправлять запросы POST и GET со следующими параметрами.

feedLink: URL ответа канала RSS: JSON или XML в качестве формата ответа

Примеры:

Для запроса POST

curl --data-urlencode "feedLink = http://feeds.bbci.co.uk/news/world/rss.xml" --data-urlencode" response = json "http://evecal.appspot.com/feedParser

Для запроса GET

evecal.appspot.com / feedParser? FeedLink = http://feeds.nytimes.com/nyt/rss/HomePage&response=xml

Моё приложение для Android "NewsSpeak" тоже использует это.

0 голосов
/ 11 июня 2010

Насколько я могу судить, синтаксический анализатор "android" SAX не поддерживает вложенность пространства имен (xmlns) (несмотря на объект rootelement, специально упоминающий пространство имен), разбитый синтаксический анализатор "J2SE" SAX также поврежден, исинтаксический анализатор DOM является весомым, но работоспособным.

Я с успехом использую DOM с пространствами имен XML, но предпочел бы решение SAX, не включающее добавление работающей библиотеки XML, такой как JDOM, в мои пакеты.

...