Android XmlPullParser Wolfram|Альфа-API

Я пытаюсь понять синтаксический анализ XML с помощью результатов API Wolfram | Alpha, я искал общие вопросы о XmlPullParser в Android, но, похоже, не смог проанализировать данные 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.

person Chris    schedule 23.09.2015    source источник


Ответы (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, в зависимости от того, какую фабрику вы использовали для создания синтаксического анализатора, потому что существует пара разных XmlPullParser фабрик. Подробнее по этому вопросу:

    Проблема 29931: XmlPullParser.next() не генерирует исключение после того, как END_DOCUMENT достигнуто

person kris larson    schedule 23.09.2015