Парсер Android XML не анализирует

Я пытаюсь разобрать XML с помощью собственного парсера Android. При этом я использую руководство IBM.

КОД

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

https://api.trafiklab.se/sl/realtid/GetSite?stationSearch=Slussen&key=7c4434c36d394e0c99396b8d1c69d9c4

Я создал класс синтаксического анализатора AndroidSaxFeedParser, который выглядит следующим образом:

public class AndroidSaxFeedParser extends BaseFeedParser {

    static final String ROOT = "http://www1.sl.se/realtidws/";
    public AndroidSaxFeedParser(String feedUrl) {
        super(feedUrl);
    }

    public List<Message> parse() {
        final Message currentMessage = new Message();
        RootElement root = new RootElement(ROOT, "Hafas");
        final List<Message> messages = new ArrayList<Message>();
        Element sites = root.getChild(SITES);
        Element site = sites.getChild(SITE);

        site.setEndElementListener(new EndElementListener(){
            public void end() {
                messages.add(currentMessage.copy());
            }
        });

        site.getChild(NUMBER).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                currentMessage.setNumber(body);
            }
        });

        site.getChild(NAME).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                currentMessage.setName(body);
            }
        });

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

BaseFeedParser, который расширяет приведенный выше класс, выглядит следующим образом:

public abstract class BaseFeedParser implements FeedParser {

    // names of the XML tags
    static final String SITES = "Sites";
    static final  String SITE = "Site";
    static final  String NUMBER = "Number";
    static final  String NAME = "Name";

    private final URL feedUrl;

    protected BaseFeedParser(String feedUrl){
        try {
            this.feedUrl = new URL(feedUrl);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    protected InputStream getInputStream() {
        try {
            return feedUrl.openConnection().getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Я вызываю парсер следующим образом:

AndroidSaxFeedParser parser = new AndroidSaxFeedParser("https://api.trafiklab.se/sl/realtid/GetSite?stationSearch=Slussen&key=7c4434c36d394e0c99396b8d1c69d9c4");
List<Message> messages = parser.parse();

(Я не включаю класс Message, так как проблемы быть не должно, у него никогда не будет возможности обработать сообщения)

ПРОБЛЕМА

Никто из слушателей в AndroidSaxFeedParser ничего не слышит. Когда я помещаю в них точки останова, они никогда не срабатывают. Я вижу, что сайты и сайт Elements подхватываются правильно (в переменных я вижу соответствующие данные). Он доходит до последней строки Xml.parse(), которая выполняется правильно, но возвращает пустой результат.

Есть идеи, где я ошибаюсь? Спасибо!


person mattboy    schedule 13.05.2012    source источник


Ответы (2)


Я попытался следовать учебнику IBM и нашел его бесполезным.

В конце концов я нашел новый пример и написал этот учебник, он анализирует RSS-канал, но те же принципы применимы к любому XML.

http://droidapp.co.uk/?p=166

person Tony    schedule 13.05.2012
comment
Выглядит достаточно просто, спасибо. Я попробую, если никто не сможет найти простое решение того, что у меня уже есть. Я также надеялся использовать SAX, а не DOM (что, я думаю, используется в вашем примере), хотя это, вероятно, не имеет большого значения. - person mattboy; 14.05.2012

Что ж, мне не удалось заставить его работать с парсером SAX Android, поэтому вместо этого я переключился на класс XmlPullFeedParser, также согласно примеры IBM. Это работало без каких-либо проблем. Дешёвое решение, но придётся.

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

person mattboy    schedule 17.05.2012