我在解析XML时面临问题。它占据了47%的CPU并且非常慢。似乎DOM将XML加载到内存中,然后从那里开始逐节点地读取XML树。
我正在读取节点并将其转储到数据库。
我想要一个解决方案,我可以在不加载到内存中的情况下读取XML。
我正在使用JDK1.4.2_05。
答案 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库似乎不再维护了。但它仍然有用。