我正在尝试解析一个看似如下的永无止境的xml流:
<outer>
<foo>footext</foo>
<bar>bartext</bar>
</outer>
<outer>
<foo>footext</foo>
<bar>bartext</bar>
</outer>
<outer>
<foo>footext</foo>
<bar>bartext</bar>
</outer>
...
我已经设置了SAXParser:
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser parser = factory.newSAXParser();
我可以使用InputStream调用它,并且我可以很容易地实现Defaulthandler:
parser.parse(theInputStream, myHandler);
问题是我需要parser.parse在遇到</outer>
结束标记之后实际返回,以便我可以返回我从xml中解析出来的对象。这样做的原因是我的解析代码(在一个名为XMLParser的类中)在这样的循环中被调用:
while(condition) {
Object o = xmlParser.getNextObject();
... do something with the object ...
}
是否可以在读取整个可用流之前从解析(InputStream,DefaultHandler)调用返回SAXParser?
答案 0 :(得分:0)
这个IBM article使用了抛出异常的技巧。通常,您不应该使用Exceptions来控制程序流,但这可能是最简单的方法。
我不建议使用香草SAXException
。创建一个类似DataOfInterestFoundException
的子类并抛出它。然后,调用SAX解析的代码可以捕获这种类型的异常以便正常停止,并将其他所有异常视为真正的异常。
另一个解决方案可能是使用您自己的输入流包装输入流,以某种方式说服SAX解析器停止。不确定你能做到这一点。