Android XML解析器无法解析

时间:2012-05-13 20:15:00

标签: android xml xml-parsing android-xml

我正在尝试使用Android自己的解析器解析XML。我这样做是以IBM tutorial为指导。

代码

我正在测试的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()行,该行正确执行但返回空白结果。

我出错的任何想法?谢谢!

2 个答案:

答案 0 :(得分:1)

我试图遵循IBM教程,发现它徒劳无功。

最后我发现了一个新的例子并编写了本教程,它解析了一个RSS提要,但同样的原则适用于任何XML。

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

答案 1 :(得分:0)

好吧,我无法使用Android的SAX解析器,所以我转而使用XmlPullFeedParser类,同样根据IBM's examples。这没有任何问题。廉价的解决方案,但它必须要做。

我发布了代码,但在测试时我也切换到了不同的XML调用,因此解析与上面的不同。