1

我正在尝试使用 Android 自己的解析器解析 XML。执行此操作时,我使用IBM 教程作为指南。

编码

我正在测试的 XML 带有以下链接。我正在尝试从中解析 Number 和 Name 。

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

有什么想法我哪里出错了吗?谢谢!

4

2 回答 2

1

我尝试按照 IBM 教程进行操作,但发现它是徒劳的。

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

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

于 2012-05-13T20:33:18.200 回答
0

好吧,我无法让它与 Android 的 SAX 解析器一起工作,所以我改用了 XmlPullFeedParser 类,同样根据IBM 的示例。这没有任何问题。便宜的解决方案,但它必须这样做。

I'd post the code, but while testing it I also switched to a different XML call so the parsing is different from the above.

于 2012-05-17T09:33:22.653 回答