最近在项目中需要把一些系统配置表导到XML文件中,一开始觉得数据量不大,使用dom4j就可以了,后来才发现数据量超出预期的大小,程序很快就内存溢出了。SAX在顺序遍历XML所有节点时,还是有很大的优势的。下面是我写的SAX解析XML的代码,解析大型XML文件来说性能比较好。
DefaultElementHandler.java
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public abstract class DefaultElementHandler extends DefaultHandler{
//入栈标志
private boolean begin;
//节点名称
private String tagName;
//内容缓冲区
private StringBuilder sb;
//带节点名称的构造方法
public DefaultElementHandler(String tagName) {
this.tagName = tagName;
this.begin = false;
this.sb = new StringBuilder();
}
/**
* 处理节点开始
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equals(tagName) || begin) {
sb.append("<");
sb.append(qName);
sb.append(" ");
int attrCount = attributes.getLength();
for(int i=0;i<attrCount;i++){
sb.append(attributes.getQName(i));
sb.append("=\"");
sb.append(attributes.getValue(i));
sb.append("\" ");
}
sb.append(">");
begin = true;
}
}
/**
* 处理节点内容
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
String text = new String(ch, start, length);
if (text.trim().equals(""))
return;
if (begin)
sb.append(text);
}
/**
* 处理节点结束
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
String stag = "</" + tagName + ">";
String ntag = "</" + qName + ">";
if (stag.equals(ntag) || begin) {
sb.append(ntag);
if (stag.equals(ntag)) {
begin = false;
try {
Document doc = DocumentHelper.parseText(sb.toString());
Element element = doc.getRootElement();
this.processElement(element);
} catch (DocumentException e) {
e.printStackTrace();
}
sb.setLength(0);
}
}
}
/**
* 对节点进行操作
* @param element
*/
public abstract void processElement(Element element);
}
SAXReadXML
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.dom4j.Element;
public class SAXReadXML {
/**
* @param args
* @throws Exception
* @throws
*/
public static void main(String[] args) throws Exception {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sax = sf.newSAXParser();
//"TABLE"是需要处理的节点
sax.parse("d:\\myxml.xml", new DefaultElementHandler("TABLE"){
@Override
public void processElement(Element element) {
//这里获得了每一个"TABLE"节点,在这里做具体的操作。
System.out.println(element.asXML());
}
});
}
}
用这段程序解析1GB的XML文件都不会出现内存溢出,而且同时拥有dom4j对节点处理的方便性。
myxml.xml
<?xml version="1.0" encoding="UTF-8"?>
<TABLES>
<TABLE>
<ID>ID0</ID>
<NAME>NAME0</NAME>
<VALUE>VALUE0</VALUE>
<DESC>DESC0</DESC>
<COLUMNS>
<COLUMN>
<C1>C10</C1>
<C2>C20</C2>
<C3>C30</C3>
</COLUMN>
<COLUMN>
<C1>C10</C1>
<C2>C20</C2>
<C3>C30</C3>
</COLUMN>
</COLUMNS>
</TABLE>
<TABLE>
<ID>ID1</ID>
<NAME>NAME1</NAME>
<VALUE>VALUE1</VALUE>
<DESC>DESC1</DESC>
<COLUMNS>
<COLUMN>
<C1>C11</C1>
<C2>C21</C2>
<C3>C31</C3>
</COLUMN>
<COLUMN>
<C1>C11</C1>
<C2>C21</C2>
<C3>C31</C3>
</COLUMN>
</COLUMNS>
</TABLE>
<TABLE>
<ID>ID2</ID>
<NAME>NAME2</NAME>
<VALUE>VALUE2</VALUE>
<DESC>DESC2</DESC>
<COLUMNS>
<COLUMN>
<C1>C12</C1>
<C2>C22</C2>
<C3>C32</C3>
</COLUMN>
<COLUMN>
<C1>C12</C1>
<C2>C22</C2>
<C3>C32</C3>
</COLUMN>
</COLUMNS>
</TABLE>
</TABLES>
分享到:
相关推荐
在处理大型XML文件时,传统的DOM(Document Object Model)解析方式可能会遇到性能问题,因为DOM会将整个XML文档加载到内存中,对于超大文件,这可能导致内存溢出。为了解决这个问题,我们可以采用流式解析的方式,...
1. **效率高**:SAX解析器只读取和处理当前需要的部分,不需要将整个XML文件加载到内存,尤其适合处理大型XML文档。 2. **内存消耗小**:与DOM解析器(将整个XML结构转化为内存中的树形结构)相比,SAX解析器对内存...
这种方式节省了大量内存,尤其适用于处理大型XML文档。本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB...
对于小型XML文档,DOM解析可能是更简单的选择,但对于大型XML文件,SAX解析则是更好的解决方案。 在实际应用中,你可能还需要考虑错误处理,例如,处理XML格式错误或网络问题。同时,为了提高代码可读性和可维护性...
使用SAX解析XML的优点在于效率高,适用于处理大型XML文件。但缺点是需要编写更多代码来处理事件,且无法方便地进行随机访问或修改XML结构。 在实际应用中,我们可能会遇到以下场景: - 数据流处理:如果XML数据来自...
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...
这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析XML的示例代码。 3. **JDOM**:JDOM是一个Java API,专门用于读写XML文档。它提供了一个更面向Java的对象模型,...
总结,SAX解析XML在Android开发中是一个实用且高效的解决方案,尤其适用于处理大型XML文件。通过创建自定义的事件处理器,可以灵活地解析和处理XML数据,满足各种业务需求。不过,需要注意的是,由于SAX是基于事件的...
Java解析XML数据主要涉及到的是对XML文档的读取和处理,SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,适用于处理大型XML文件。与DOM(Document Object Model)解析器不同,SAX不需要一次性加载...
总结来说,SAX解析XML是一种高效且节省内存的方法,尤其适合处理大型XML文件。通过创建自定义的事件处理器,可以灵活地获取和处理XML元素的值。在实际开发中,根据项目需求和文件大小选择合适的解析方式,是优化性能...
总的来说,SAX解析XML是一种高效且灵活的方法,适用于处理大型XML文档。通过自定义事件处理器,我们可以根据业务需求定制解析逻辑,从而有效地解析和利用XML数据。在实际项目中,结合源码分析和工具使用,如IDE中的...
SAX(Simple API for XML)是XML解析的一种方式,它以事件驱动模型来处理XML文档,相比于DOM(Document Object Model)解析,SAX解析器占用更少的内存,更适合处理大型XML文件。 SAX解析的基本原理是读取XML文档,...
相较于DOM解析,SAX解析不将整个XML文档加载到内存中,而是采用事件驱动的方式,逐行读取并处理XML内容,因此在处理大型XML文件时更为高效。下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下...
3. 内存消耗:由于整个文档在内存中,对于大型XML文件,可能会消耗大量资源。 4. 适合小到中等规模的文件,以及需要频繁进行数据查找和修改的应用场景。 二、SAX解析 SAX(Simple API for XML)解析器以事件驱动的...
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
SAX(Simple API for XML)是XML解析的一种方法,它采用事件驱动的方式处理XML文档,对内存占用较少,适合处理大型XML文件。 在Java中,SAX解析器遵循XML规范,当解析XML文档时,会触发一系列的事件,如开始文档、...
虽然DOM提供了一种方便的方式来访问和修改XML文档的任何部分,但这种方法对内存的需求较大,不适合处理大型XML文件。 **SAX解析**: 相比之下,SAX解析器采用事件驱动模型,逐行读取XML文档,遇到元素、属性等结构...
本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络获取的XML文件。 1. **XML与SAX解析基础** - XML是一种结构化的文本数据表示方式,它定义了标签、属性等规则,使数据具有自解释性。 - SAX解析器...
在处理大型XML文件时,由于内存限制,我们通常选择流式解析方法,如SAX(Simple API for XML)。本文将深入探讨SAX解析XML文档的原理、优势和具体实现。 SAX解析器是一种基于事件驱动的解析模型,它读取XML文档,...