gpt4 book ai didi

java - 使用 dom4j 从流中读取单个 XML 文档

转载 作者:太空宇宙 更新时间:2023-11-04 09:01:33 24 4
gpt4 key购买 nike

我尝试使用 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 类的子类化,但它确实有效。

关于java - 使用 dom4j 从流中读取单个 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/226105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com