我正在使用android的SAX解析器,我希望在读完N个元素后停止处理。有些饲料非常大,可能需要一段时间才能完成。如果某个元素的EndElementListener中满足某些条件,我该如何停止解析?这是我现在的听众
chanItem.setEndElementListener(new EndElementListener() {
public void end() {
_items.add(_item);
if (++_currentItem == _maxElements) {
//BREAK OUT HERE
}
}
});
我已尝试在end()中抛出异常,但EndElementListener不允许抛出任何异常。 非常感谢指导。
答案 0 :(得分: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,它不需要例外提前爆发。
答案 1 :(得分:0)
“杰西威尔逊”的答案很好,但在我的情况下,我必须保留de值,返回我的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;
}