我有一个高达 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/