将大型XML文件(100k记录)导入数据库

时间:2011-09-02 18:45:13

标签: java xml dom

我在解析XML时面临问题。它占据了47%的CPU并且非常慢。似乎DOM将XML加载到内存中,然后从那里开始逐节点地读取XML树。

我正在读取节点并将其转储到数据库。

我想要一个解决方案,我可以在不加载到内存中的情况下读取XML。

我正在使用JDK1.4.2_05。

3 个答案:

答案 0 :(得分:4)

寻找SAX解析器,它是在没有在内存中构建完整DOM的情况下使用XML的唯一方法。有一些限制,但也许它会满足您的需求。

答案 1 :(得分:0)

尝试StAX或SAX。

答案 2 :(得分:0)

Nux项目包含StreamingPathFilter类。使用此类,您可以将SAX的流媒体设备和低内存占用与DOM的易用性结合起来。

但这只适用于您的XML文档具有类似记录的结构。例如。很多<person/>元素。

(以下示例来自Nux网站并由我修改)

首先定义如何处理一条记录:

StreamingTransform myTransform = new StreamingTransform() {
  public Nodes transform(Element person) {
    // Process person element, i.e. store it in a database
    return new Nodes(); // mark element as subject to garbage collection
  }
}; 

然后创建一个StreamingPathFilter传递一个与您的记录节点匹配的XPath表达式。

// parse document with a filtering Builder
NodeFactory factory = new StreamingPathFilter("/persons/person", null).
                            createNodeFactory(null, myTransform);
new Builder(factory).build(new File("/tmp/persons.xml"));

Nux库似乎不再维护了。但它仍然有用。