Заставить XmlPullParser игнорировать пробелы?

Я анализирую Xml с помощью XmlPullParser. Я просто хочу иметь дело с тегами Xml и текстом, содержащимся в них, однако XmlPullParser читает текст пробелов (пробелы и возврат каретки) между тегами. Можно ли настроить игнорирование этого пробела?


person sonicboom    schedule 30.12.2012    source источник


Ответы (3)


Я не использовал XmlPullParser раньше (так что извиняюсь, если это совершенно неправильно), но, взглянув на javadocs, кажется, что когда вы вызываете nextToken() вам придется просмотреть возвращаемое значение и пропустить IGNORABLE_WHITESPACE .

Следующее было неуместным (спасибо Jeff): Кстати, вы вынуждены использовать XmlPullParser? Основываясь на том, что звучит, как вы пытаетесь достичь, я бы рассмотрел API более высокого уровня, например Просто. Обычно я использую JAXB, но это не по моей воле, ха-ха.

person phippsnatch    schedule 30.12.2012
comment
Вероятно, он использует синтаксический анализатор из-за нехватки памяти. Я не уверен, знакомы ли вы с Android, но синтаксический анализ больших XML-документов невозможен с полным AST в памяти — вам нужно использовать синтаксический анализ по запросу, чтобы обработать что-либо, превышающее определенный размер. - person Jeff Hubbard; 31.12.2012
comment
Верно ли фактическое предложение относительно того, что он может сделать с XmlPullParser, или есть более приятный способ? Очевидно, я привык иметь дело с серверами, а не с телефонами, ха-ха :) Весело! - person phippsnatch; 31.12.2012
comment
В зависимости от того, насколько велик его документ (а если он выбрал синтаксический анализатор по запросу, он, скорее всего, большой), то синтаксический анализ по запросу, вероятно, является лучшим способом справиться с ним. Что касается пропуска пробелов, я не уверен. Мне никогда не приходилось иметь дело с достаточно большими XML-документами, чтобы с ними возникали проблемы (моим проклятием был JSON). - person Jeff Hubbard; 31.12.2012
comment
Да, я думаю, мне просто придется вручную пропустить игнорируемые пробелы, я надеялся, что есть настройка, которая автоматически пропустит его. XML-документы, которые я разбираю, на самом деле крошечные, но я использую XmlPullParser, поскольку Google рекомендует его для Android — developer.android.com/training/basics/network-ops/xml.html - person sonicboom; 03.01.2013

IDK, если есть настройка для игнорирования пробелов. Если вы отслеживаете текущий узел в виде строки, вы можете запрограммировать игнорирование пробелов. Если текущий узел пуст, просто игнорируйте текст. Мое тестирование показало, что это были просто экранированные переводы строк и тому подобное. Я оптимизировал его следующим образом. Опасно! Это работает с XML-файлом, который я использую, но может не работать с вашим

String N="";  // Yes I know its Capitalized but its the Current Node and very important to keep track of.


if (eventType == XmlPullParser.START_TAG) {
    N = xpp.getName();//save the name of the node.

...

} else if (eventType == XmlPullParser.END_TAG) {
    N = "";//clear the name of the node.
} else if (eventType == XmlPullParser.TEXT) {
    //if the name of the node is not blank then process it
if (!N.equals("")) {
        //I have a node so process it
    }

Удачи

person danny117    schedule 30.08.2013

Добавление позднего ответа после того, как я сам искал решение.

Парсер имеет метод isWhiteSpace(). Его можно вызывать только для типов событий, связанных с текстом (например, TEXT, CDSECT, IGNORABLE_WHITESPACE), в противном случае он будет сгенерирован.

Вы можете получить тип события, вызвав либо next, который продвигает парсер, либо getEventType.

Вызов next автоматически пропускает событие IGNORABLE_WHITESPACE. Этот тип события возникает только при вызове nextToken, который является более точным и затрагивает все типы событий. Несмотря на то, что мы пропускаем «игнорируемые» пробелы, вызывая next, синтаксический анализатор по-прежнему находит почти все пробелы неигнорируемыми, и поэтому ему требуется ваше разрешение, чтобы пропустить их.

    boolean isEoD = false;

    do{
        switch (parser.next()){

            default:
                break;
            case XmlPullParser.TEXT:

                if(!parser.isWhitespace())  //Throws if called on wrong eventType
                    System.out.println("Text: " + parser.getText());

                break;
            case XmlPullParser.START_TAG:
            case XmlPullParser.END_TAG:
                System.out.println("TAG: " + parser.getName()+ "\n");
                break;

            case XmlPullParser.END_DOCUMENT:
                isEoD = true;
        }
    }while(!isEoD);
person NameSpace    schedule 08.09.2016