Java Sax Parser - остановить обработку в EndElementListener

1

Я использую парсер android SAX, и я хочу прекратить обработку после того, как я прочитал N элементов. Некоторые из кормов довольно велики и могут занять некоторое время. Как я могу прекратить разбор, если определенные условия выполняются в EndElementListener для определенного элемента? Вот мой текущий слушатель

chanItem.setEndElementListener(new EndElementListener()  {
    public void end() {
        _items.add(_item);
        if (++_currentItem == _maxElements) {
                //BREAK OUT HERE
        }
    }
});

Я попытался сделать исключение в end(), но EndElementListener не позволяет бросать какие-либо исключения. Руководство будет высоко оценено.

  • 0
    Дубликат stackoverflow.com/q/1345293/965648
  • 0
    На самом деле это не Ник - если вы посмотрите, то увидите, что мой немного отличается, потому что он использует синтаксический анализатор android.sax. Я не могу выбросить исключение в EndElementListener, потому что интерфейс не поддерживает его.
Показать ещё 3 комментария
Теги:
saxparser
sax

2 ответа

2
Лучший ответ

Определите новое исключенное исключение, называемое "SaxBreakOutException":

class SaxBreakOutException extends RuntimeException {
}

Бросьте это в слушателя:

chanItem.setEndElementListener(new EndElementListener()  {
    public void end() {
        _items.add(_item);
        if (++_currentItem == _maxElements) {
            throw new SaxBreakOutException();
        }
    }
});

И поймайте его в коде, который вызывает XmLReader.parse():

reader.setContentHandler(handler);
try {
    reader.parse(new InputSource(new StringReader(xml)));
} catch (SaxBreakOutException allDone) {
}

В качестве альтернативы, переключитесь на Android XmlPullParser, который не требует исключений для раннего выхода.

  • 0
    Фантастика! Я сам пробовал этот метод, но расширял SaxException вместо RuntimeException. Спасибо Джесси ..
0

Ответ "Джесси Уилсон" хорош, но в моем случае мне пришлось сохранить значения, возвращающие мой метод parse().

List<Article> ArticleNews = parser.parse();

Поэтому я добавил логическое значение;

int countArts;
boolean stopParse;

когда мне пришлось остановить мой метод parser(), я потребляю всех слушателей с помощью

if(stopParse)return;

пример:

public List<Article> parse(){
        final List<Article> myArticles= new ArrayList<Article>();

        final RootElement root = new RootElement("articles");
        Element nota = root.getChild("article");


        nota.setStartElementListener(new StartElementListener(){
            @Override
            public void start(Attributes attributes) {
                Log.i("----------------------------------------", "START Article!\n");
            }
        });

        nota.setEndElementListener(new EndElementListener(){
            public void end() {  

                if(countArts>9){    //only 10 articles!.
                    stopParse=true;
                }               
                countArts++;
                Log.i("----------------------------------------", "END Article!\n");

            }
        });


        nota.getChild(ID).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                if(stopParse)return;
                if(Utilities.isNumeric(body)) {
                    idA = body;
                }
            }
        });
        nota.getChild(CATEGORY).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                if(stopParse)return;
                categoriaA = body;
            }
        });

        nota.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                if(stopParse)return;
                tituloA = body;
            }
        });

        try {
            Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler());
        }  catch (Exception e) {
            Log.e(" *** Exception Xml.parse() ", e.getMessag
        }
        return myArticles;
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню