java - 在 Java 中计算 xml 节点的最有效方法是什么

标签 java xml

我有一个高达 1-2gb 的巨大 XML 文件,显然我不能一次解析整个文件,我必须将它分成几个部分然后解析这些部分并对其进行任何处理。

如何计算某个节点的数量?所以我可以跟踪我需要分割文件的部分。有没有更好的方法来做到这一点?我愿意接受所有建议谢谢

问题更新:

好吧,我确实使用了 STAX,也许我使用它的逻辑是错误的,我正在解析文件,然后为每个节点获取节点值并将其存储在字符串生成器中。然后在另一种方法中,我通过 stringbuilder 并编辑输出。然后我将该输出写入文件。我最多只能做 10000 个这样的对象。

这是我得到的异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at com.sun.org.apache.xerces.internal.util.NamespaceSupport.<init>(Unkno
wn Source)
        at com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.setNamespace
Context(Unknown Source)
        at com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.getXMLEvent(
Unknown Source)
        at com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.allocate(Unk
nown Source)
        at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Sour
ce)
        at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(Unk
nown Source)
        at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(Unkn
own Source)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
mIdentity(Unknown Source)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
m(Unknown Source)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
m(Unknown Source)

实际上我认为我的整个方法是错误的,我实际上是在尝试将 xml 文件转换为 CSV 样本。到目前为止,这是我的做法:

  • 读取/解析xml文件
  • 为每个元素节点获取文本节点值
  • 打开流将其写入文件(temp),对于n个节点然后刷新并关闭流
  • 然后打开另一个从 temp 读取的流,使用 commons strip utils 和其他一些东西来创建正确的 csv 输出,然后将其写入 csv 文件

最佳答案

SAX 或 STAX API 是您最好的选择。他们不会一次解析整个事情,他们一次只获取一个节点并让您的应用程序处理它。它们适用于任意大的文档。

SAX 是较旧的 API,适用于推送模型,STAX 较新,是拉式解析器,因此更易于使用,但根据您的要求,两者都可以。

参见 this tutorial让您开始使用 STAX 解析。

关于java - 在 Java 中计算 xml 节点的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289188/

相关文章:

java - 我的第一个自动 SQL 插入 : I feel im losing a lot of performance here

java - 灰屏/重启后 Android Studio NullPointerException(无错误消息)

Android XML 错误 : no resource identifier found for attribute 'xmlns' in package 'android'

使用 xquery 比较 XML

xml - MSN天气API条件列表?

java - 无法在我们只有 td 标签文本的动态表中获取元素

java - 如何破译网络程序中的乱码/乱码

java - 是否可以设置 Twilio 验证 api token 到期时间?

android - 适用于 Android 和 iOS 的数据库格式

android布局动态调整大小