Я использую парсер android SAX, и я хочу прекратить обработку после того, как я прочитал N элементов. Некоторые из кормов довольно велики и могут занять некоторое время. Как я могу прекратить разбор, если определенные условия выполняются в EndElementListener для определенного элемента? Вот мой текущий слушатель
chanItem.setEndElementListener(new EndElementListener() {
public void end() {
_items.add(_item);
if (++_currentItem == _maxElements) {
//BREAK OUT HERE
}
}
});
Я попытался сделать исключение в end(), но EndElementListener не позволяет бросать какие-либо исключения. Руководство будет высоко оценено.
Определите новое исключенное исключение, называемое "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, который не требует исключений для раннего выхода.
Ответ "Джесси Уилсон" хорош, но в моем случае мне пришлось сохранить значения, возвращающие мой метод 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;
}