我可以在解析整个InputStream之前使SAXParser.parse()返回吗?

时间:2011-09-10 19:46:51

标签: java xml xml-parsing saxparser

我正在尝试解析一个看似如下的永无止境的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?

1 个答案:

答案 0 :(得分:0)

这个IBM article使用了抛出异常的技巧。通常,您不应该使用Exceptions来控制程序流,但这可能是最简单的方法。

我不建议使用香草SAXException。创建一个类似DataOfInterestFoundException的子类并抛出它。然后,调用SAX解析的代码可以捕获这种类型的异常以便正常停止,并将其他所有异常视为真正的异常。

另一个解决方案可能是使用您自己的输入流包装输入流,以某种方式说服SAX解析器停止。不确定你能做到这一点。