【问题标题】:Android XmlPullParser Wolfram|Alpha APIAndroid XmlPullParser Wolfram|Alpha API
【发布时间】:2015-12-20 04:14:23
【问题描述】:

我正在尝试使用 Wolfram|Alpha API 的结果找出 XML 解析,我搜索了有关 Android 中 XmlPullParser 的一般问题,但似乎无法解析 XML 数据。

try {
    URL url = new URL(urlString);
    URLConnection urlConnection = url.openConnection();
    InputStream response = urlConnection.getInputStream();

    XmlPullParser parser = Xml.newPullParser() 
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
    parser.setInput(response, null);
    parser.nextTag();            
    results = readFeed(parser);
} catch (Exception e) {
    e.printStackTrace();
}

我可以很好地连接到 API 并返回结果。 http://products.wolframalpha.com/api/explorer.html 您将能够看到返回的结果。

我的基本请求如下所示:http://api.wolframalpha.com/v2/query?appid=xxx&input=What%20day%20is%20today%3F&format=plaintext

现在解析 inputStream:

private List<String> readFeed(XmlPullParser parser) throws   XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, null, "queryresult");
    List<String> entries = new ArrayList<>();

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }

        String name = parser.getName();

        // Starts by looking for the entry tag
        if (name.equals("pod")) {
            System.out.print(" In pod: " + parser.getName());
            entries.add(readEntry(parser));
        }
        else{
            skip(parser);
        }
    }

    return entries;
}

private String readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, null, "pod");
    String plainText = null;

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }

        String name = parser.getName();

        if (name.equals("subpod")) {
            System.out.print(" In subpod: " + parser.getName());
            plainText = getPlainText(parser);
        }
        else{
            skip(parser);
        }
    }

    return plainText;
}

private String getPlainText(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, null, "subpod");
    String result = null;

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }

        String name = parser.getName();

        if (name.equals("plaintext")) {
            System.out.print(" In plaintext: " + parser.getText());
            result = parser.getText();
        }
        else{
            skip(parser);
        }
    }

    return result;
}

我的控制台上的结果如下所示:

I/System.out﹕ In pod: pod In subpod: subpod In plaintext: null[null] 

代码运行良好,但存在一些问题:

  1. 找不到明文标签的值。
  2. 这似乎只循环通过第一个 pod 标签。

【问题讨论】:

    标签: android xml api xmlpullparser wolframalpha


    【解决方案1】:
    • 在您的getPlainText() 方法中,您正在推进START_TAG 事件,然后调用parser.getText()。我相信你需要提前到TEXT 事件,以便parser.getText() 返回任何东西。你的意思可能是不要使用parser.nextText()

    • 由于您使用parser.next() 的方式,您没有获得所有标签。

      getPlainText() 中,循环直到点击END_TAG,然后返回。现在readEntry() 处于循环中间,所以接下来发生的事情是parser.next()再次调用。由于您已经参加了END_TAG 事件,因此您最终会跳过整个标签。您应该针对parser.getEventType() 测试事件类型,这不会推进解析器。仅当您完成当前事件(包括决定跳过)后才调用parser.next()

      当您收到END_TAG 事件时,您也将退出。您真的想通过测试 END_DOCUMENT 来开始循环,因为显然parser.next()END_DOCUMENT 事件之后可能会或可能不会抛出异常,这取决于您用来构建解析器的工厂,因为有几个不同的@987654339 @工厂。阅读有关此问题的更多信息:

      Issue 29931: XmlPullParser.next() doesn't throw an exception after END_DOCUMENT is reached

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多