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

ant*_*ant 3 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)
Run Code Online (Sandbox Code Playgroud)

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

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

ska*_*man 5

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

SAX是较旧的API,并且在推模型上工作,STAX是更新的并且是拉解析器,因此更容易使用,但是根据您的要求,任何一个都可以.

请参阅本教程以开始使用STAX解析.