在JAVA中解析大型XML文档


问题内容

我有以下问题:

我有一个XML文件(大约1GB),并且必须上下迭代(即不连续;一个接一个),以便获取所需的数据并对其进行一些操作。最初,我使用了DOM
Java包,但是很显然,在解析XML文件时,JVM达到了其最大堆空间并停止了运行。

为了解决这个问题,我想到的解决方案之一是找到另一个解析器,该解析器迭代XML中的每个元素,然后将其内容存储在硬盘上的临时SQLite数据库中。因此,通过这种方式,不会超过JVM的堆,并且一旦所有数据都填满,我将忽略XML文件并继续在临时SQLite数据库上进行操作。

还有另一种方法可以解决我的问题吗?


问题答案:

SAX(XML的简单API)将在这里您提供帮助。

与DOM解析器不同,SAX解析器不会创建XML文档的内存表示形式,因此速度更快且使用的内存更少。而是,SAX解析器通过调用回调(即,通过调用org.xml.sax.helpers.DefaultHandler提供给解析器的实例上的方法)来将XML文档结构通知客户端

这是一个示例实现:

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);

MyHandler您可以在其中定义在生成文档/元素的开始/结束之类的事件时要采取的措施。

class MyHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void endDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

    // To take specific actions for each chunk of character data (such as
    // adding the data to a node or buffer, or printing it to a file).
    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
    }

}