我试图一次使用dom4j从流中读取单个XML文档,对其进行处理,然后继续处理流中的下一个文档。不幸的是,dom4j的SAXReader(在后台使用JAXP)使以下文档元素不断读取和阻塞。

一旦找到文档元素的末尾,是否有办法让SAXReader停止读取流?有没有更好的方法可以做到这一点?

最佳答案

我可以使用一些内部JAXP类将其与某些体操一起使用:


创建一个自定义扫描程序,它是XMLNSDocumentScannerImpl的子类


在自定义扫描程序内创建一个自定义驱动程序(XMLNSDocumentScannerImpl.Driver的实现),当看到声明或元素时,该扫描程序将返回END_DOCUMENT。从fElementScanner.getCurrentEntity()获取ScannedEntity。如果实体具有PushbackReader,则将实体缓冲区中剩余的未读字符推回阅读器。
在构造函数中,用此自定义驱动程序的实例替换fTrailingMiscDriver。

创建一个自定义配置类,它是XIncludeAwareParserConfiguration的子类,用其构造函数中的此自定义扫描器实例替换库存DOCUMENT_SCANNER。
安装此自定义配置类的实例作为“ com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration”属性,以便在dom4j的SAXReader类尝试创建JAXP XMLReader时将其实例化。
当将Reader传递给dom4j的SAXReader.read()方法时,请提供PushbackReader,其缓冲区大小比默认的一个字符大得多。至少8192应该足以支持JAXP的Apache2副本中XMLEntityManager的默认缓冲区大小。


这不是最干净的解决方案,因为它涉及内部JAXP类的子类化,但是它确实起作用。

10-08 01:53