Dom4j按流的方式读取超大文件

本文使用Dom4J读取超大XML文件,并保持很小的内存占用量。适用于不需要将XML全部内容驻留在内存,处理一部分就扔掉一部分的情况。



public class Dom4jSaxReaderSimpleExample implements ElementHandler {

public void start(File file) throws DocumentException {
SAXReader reader = new SAXReader();
reader.addHandler("/root/item", this);
reader.setDefaultHandler(new PruningElementHandler());
reader.read(file);
}

@Override
public void onStart(ElementPath elementPath) {
elementPath.getCurrent().detach();
}

@Override
public void onEnd(ElementPath elementPath) {
Element elm = elementPath.getCurrent();

// TODO process with elm

elm.detach();
elm = null;
}

public static void main(String[] args) throws DocumentException {
new Dom4jSaxReaderSimpleExample().start(new File("big.xml"));
}

}

class PruningElementHandler implements ElementHandler {
public final void onStart(ElementPath elementPath) {
elementPath.getCurrent().detach();
}

public void onEnd(ElementPath elementPath) {
Element elem = elementPath.getCurrent();
elem.detach();
elem = null;
}
}



需要注意的是应该在onStart方法里面将Element detach掉,还有就是除了注册需要的ElementHandler之外,还应该注册DefaultHandler,如例子中那样。

这是因为虽然已经用了SAX按流的方式读取XML文件,DOM4J还是会在内存创建XML的DOM结构,这会导致内存溢出,这时只要将Element对象Detach掉,在onEnd处理该Element之后,垃圾回收会将Detach的节点回收,这样就可以小内存占用处理大XML文件。

----
好的,这个问题我可以回答。以下是Java使用dom4j读取XML文件的基本步骤: 1. 导入dom4j的jar包 你可以通过maven或手动下载jar包的方式导入dom4j的jar包。 2. 创建SAXReader对象 SAXReader是dom4j的核心类,用于读取XML文件并将其转换为Document对象。 3. 加载XML文件 使用SAXReader对象的read方法加载XML文件,并将其转换为Document对象。 4. 获取根节点 通过Document对象的getRootElement方法获取XML文件的根节点。 5. 遍历节点 可以使用递归的方式遍历XML文件的节点,获取节点的名称、属性、子节点等信息。 下面是一个简单的示例代码: ```java import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.File; public class Dom4jDemo { public static void main(String[] args) { try { // 创建SAXReader对象 SAXReader reader = new SAXReader(); // 加载XML文件 Document document = reader.read(new File("example.xml")); // 获取根节点 Element root = document.getRootElement(); // 遍历节点 print(root); } catch (Exception e) { e.printStackTrace(); } } public static void print(Element element) { // 输出节点名称 System.out.println(element.getName()); // 输出节点属性 List<Attribute> attributes = element.attributes(); for (Attribute attribute : attributes) { System.out.println(attribute.getName() + ": " + attribute.getValue()); } // 输出子节点 List<Element> elements = element.elements(); for (Element e : elements) { print(e); } } } ``` 以上是一个简单的dom4j读取XML文件的示例代码,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值