使用stax和dom读取大XML文件


问题内容

我需要阅读几个大(200Mb-500Mb)XML文件,所以我想使用StaX。我的系统有两个模块-
一个用于读取文件(使用StaX);另一个用于读取文件。另一个模块(“解析器”模块)假定获取该XML的单个条目并使用DOM对其进行解析。我的XML文件没有特定的结构-因此我无法使用JaxB。如何向“解析器”模块传递要解析的特定条目?例如:

<Items>
   <Item>
        <name> .... </name>
        <price> ... </price>
   </Item>
   <Item>
        <name> .... </name>
        <price> ... </price>
   </Item>
</Items>

我想使用StaX来解析该文件-但是每个“项目”条目都将传递到“解析器”模块。

编辑:
多一点阅读之后-我想我需要一个使用流读取XML文件的库-但使用DOM解析每个条目。有这样的事吗?


问题答案:

您可以使用StAX(javax.xml.stream)解析器并将javax.xml.transform每个部分转换()到DOM节点(org.w3c.dom):

import java.io.*;
import javax.xml.stream.*;
import javax.xml.transform.*;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.dom.DOMResult;
import org.w3c.dom.*

public class Demo {

    public static void main(String[] args) throws Exception  {
        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));
        xsr.nextTag(); // Advance to statements element

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
            DOMResult result = new DOMResult();
            t.transform(new StAXSource(xsr), result);
            Node domNode = result.getNode();
        }
    }

}

另请参阅:

  • 使用Java分割1GB Xml文件