Java Sax Parser - 在EndElementListener中停止处理

时间:2011-11-30 19:45:59

标签: java android xml sax saxparser

我正在使用android的SAX解析器,我希望在读完N个元素后停止处理。有些饲料非常大,可能需要一段时间才能完成。如果某个元素的EndElementListener中满足某些条件,我该如何停止解析?这是我现在的听众

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

我已尝试在end()中抛出异常,但EndElementListener不允许抛出任何异常。 非常感谢指导。

2 个答案:

答案 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;
    }