【问题标题】:Android XML parser not parsingAndroid XML解析器不解析
【发布时间】:2012-05-21 10:31:05
【问题描述】:

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

代码

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

任何想法我哪里出错了?谢谢!

【问题讨论】:

    标签: android xml xml-parsing android-xml


    【解决方案1】:

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

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

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

    【讨论】:

    • 看起来很简单,谢谢。如果没有人能找到一个简单的解决方案来解决我已有的问题,我会试一试。我也希望使用 SAX 而不是 DOM(我认为您的示例正在使用它),尽管它可能并不重要。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      相关资源
      最近更新 更多