`
eyes1842
  • 浏览: 18267 次
  • 性别: Icon_minigender_1
  • 来自: 默认
最近访客 更多访客>>
社区版块
存档分类
最新评论

SAX 解析大型XML文件

    博客分类:
  • JAVA
XML 
阅读更多

最近在项目中需要把一些系统配置表导到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>

 

分享到:
评论

相关推荐

    SAX解析超大XML文件 示例代码

    在处理大型XML文件时,传统的DOM(Document Object Model)解析方式可能会遇到性能问题,因为DOM会将整个XML文档加载到内存中,对于超大文件,这可能导致内存溢出。为了解决这个问题,我们可以采用流式解析的方式,...

    Sax解析XML文件解析

    1. **效率高**:SAX解析器只读取和处理当前需要的部分,不需要将整个XML文件加载到内存,尤其适合处理大型XML文档。 2. **内存消耗小**:与DOM解析器(将整个XML结构转化为内存中的树形结构)相比,SAX解析器对内存...

    Java SAX解析Xml文档Demo

    这种方式节省了大量内存,尤其适用于处理大型XML文档。本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB...

    Servlet利用SAX解析XML文档

    对于小型XML文档,DOM解析可能是更简单的选择,但对于大型XML文件,SAX解析则是更好的解决方案。 在实际应用中,你可能还需要考虑错误处理,例如,处理XML格式错误或网络问题。同时,为了提高代码可读性和可维护性...

    sax解析xml文件

    使用SAX解析XML的优点在于效率高,适用于处理大型XML文件。但缺点是需要编写更多代码来处理事件,且无法方便地进行随机访问或修改XML结构。 在实际应用中,我们可能会遇到以下场景: - 数据流处理:如果XML数据来自...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析XML的示例代码。 3. **JDOM**:JDOM是一个Java API,专门用于读写XML文档。它提供了一个更面向Java的对象模型,...

    [Android]使用SAX解析XML文件

    总结,SAX解析XML在Android开发中是一个实用且高效的解决方案,尤其适用于处理大型XML文件。通过创建自定义的事件处理器,可以灵活地解析和处理XML数据,满足各种业务需求。不过,需要注意的是,由于SAX是基于事件的...

    java解析xml数据---sax解析器

    Java解析XML数据主要涉及到的是对XML文档的读取和处理,SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,适用于处理大型XML文件。与DOM(Document Object Model)解析器不同,SAX不需要一次性加载...

    sax解析xml尤其是获取元素的值或者内容

    总结来说,SAX解析XML是一种高效且节省内存的方法,尤其适合处理大型XML文件。通过创建自定义的事件处理器,可以灵活地获取和处理XML元素的值。在实际开发中,根据项目需求和文件大小选择合适的解析方式,是优化性能...

    SAX解析XML实例

    总的来说,SAX解析XML是一种高效且灵活的方法,适用于处理大型XML文档。通过自定义事件处理器,我们可以根据业务需求定制解析逻辑,从而有效地解析和利用XML数据。在实际项目中,结合源码分析和工具使用,如IDE中的...

    一个关于sax解析xml的demo

    SAX(Simple API for XML)是XML解析的一种方式,它以事件驱动模型来处理XML文档,相比于DOM(Document Object Model)解析,SAX解析器占用更少的内存,更适合处理大型XML文件。 SAX解析的基本原理是读取XML文档,...

    SAX解析xml文件源码

    相较于DOM解析,SAX解析不将整个XML文档加载到内存中,而是采用事件驱动的方式,逐行读取并处理XML内容,因此在处理大型XML文件时更为高效。下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下...

    DOM和SAX解析XML文档

    3. 内存消耗:由于整个文档在内存中,对于大型XML文件,可能会消耗大量资源。 4. 适合小到中等规模的文件,以及需要频繁进行数据查找和修改的应用场景。 二、SAX解析 SAX(Simple API for XML)解析器以事件驱动的...

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    sax解析xml

    SAX(Simple API for XML)是XML解析的一种方法,它采用事件驱动的方式处理XML文档,对内存占用较少,适合处理大型XML文件。 在Java中,SAX解析器遵循XML规范,当解析XML文档时,会触发一系列的事件,如开始文档、...

    dom4j下sax解析xml

    虽然DOM提供了一种方便的方式来访问和修改XML文档的任何部分,但这种方法对内存的需求较大,不适合处理大型XML文件。 **SAX解析**: 相比之下,SAX解析器采用事件驱动模型,逐行读取XML文档,遇到元素、属性等结构...

    android使用SAX解析xml

    本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络获取的XML文件。 1. **XML与SAX解析基础** - XML是一种结构化的文本数据表示方式,它定义了标签、属性等规则,使数据具有自解释性。 - SAX解析器...

    SAX对xml文档进行解析

    在处理大型XML文件时,由于内存限制,我们通常选择流式解析方法,如SAX(Simple API for XML)。本文将深入探讨SAX解析XML文档的原理、优势和具体实现。 SAX解析器是一种基于事件驱动的解析模型,它读取XML文档,...

Global site tag (gtag.js) - Google Analytics