SAX解析与DOM解析的区别

1.SAX解析(Simple API for XML)

SAX解析方式:逐行扫描文档,一遍扫描一遍解析。相比于DOM,SAX可以在解析文档的任意时刻停止解析解析,是一种速度更快,更高效的方法。

优点:解析可以立即开始,速度快,没有内存压力

缺点:不能对结点做修改

适用:读取XML文件

package cn.tedu;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import cn.tedu.entity.Emp;

/**
 * 解析XML文档
 *
 */
public class XMLReader {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader() ;
		try {
			Document doc = reader.read("emplist.xml") ;
			//获取根元素
			Element root = doc.getRootElement() ;
			System.out.println(root.getName()) ;
			//获取子元素
			List<Element> list = root.elements() ;
			//用于保存雇员信息
			List<Emp> emps = new ArrayList<Emp>() ;
			for (Element e : list) {
				//获取属性
				String id = e.attributeValue("id") ;
				String name = e.elementText("name") ;
				int age = Integer.parseInt(e.elementText("age")) ;
				String gender = e.elementText("gender") ;
				double salary = new Double(e.elementText("salary")) ;
				Emp emp = new Emp(id, name, age, gender, salary) ;
				emps.add(emp) ;
			}
			
			//遍历emps
			for (Emp emp : emps) {
				System.out.println(emp) ; 
			}
		} catch (DocumentException e) {
			e.printStackTrace() ;
			System.err.println("文档解析失败");
		}
	}
}


2.DOM解析(Document Object Model)

DOM解析方式:DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)
优点:把XML文件在内存中构建属性结构,可以遍历和修改节点。
缺点:如果文件比较大,内存有压力,解析的时间会比较长。
适用:修改XML数据

3.DOM4J

DOM4J有更复杂的api,所以dom4j比jdom有更大的灵活性.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

优点:灵活性最高、易用性和功能强大、性能优异

缺点:复杂的api、移植性差

适用:自行选择

package cn.tedu;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import cn.tedu.entity.Emp;

/**
 * 创建XML文档
 *
 */
public class CreateXml {
	public static void main(String[] args) {
		//1.创建一个空文档对象Document
		Document doc = DocumentHelper.createDocument() ;       
		//2.像Document对象中添加根元素
		Element root =doc.addElement("emplist") ;
		//3.按照预定的格式依次向根元素中添加子元素来完成文档结构
		//创建雇员信息
		List<Emp> list = new ArrayList<Emp>() ;
		Emp emp1 = new Emp("13" , "张三" , 14 , "男" , 9000.0) ;
		Emp emp2 = new Emp("14" , "李四" , 14 , "女" , 8000.0) ;
		list.add(emp1) ;
		list.add(emp2) ;
		//添加子元素
		for (Emp e : list) {
			Element emp = root.addElement("emp") ;
			emp.addAttribute("id" , e.getId()) ;
			emp.addElement("name").addText(e.getName()) ;
			emp.addElement("age").addText(e.getAge()+"") ;
			emp.addElement("gender").addText(e.getGender()) ;
			emp.addElement("salary").addText(e.getSalary()+"") ;
		}
		//4.创建XMLWriter
		XMLWriter writer = null ;
		try {
			writer = new XMLWriter(OutputFormat.createPrettyPrint()) ;
			writer.setOutputStream(new FileOutputStream("myemp.xml")) ;
			//5.将Document通过XMLWriter写成XML文档
			writer.write(doc) ;
			System.out.println("生成完毕!");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		} finally {
			if(writer != null) {
				try {
					writer.close() ;
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}	
		}
	}
}


4.JDOM

JDOM是处理xml的纯java api.使用具体类而不是接口.JDOM具有树的遍历,又有SAX的java规则.JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

优点:1、是基于树的处理xml的java api,把树加载到内存中.

        2、没有向下兼容的限制,所以比DOM简单.

        3、速度快.

        4、具有SAX的java 规则.

缺点:1、不能处理大于内存的文档.

        2、JDOM表示XML文档逻辑模型,不能保证每个字节真正变换.

        3、 针对实例文档不提供DTD与模式的任何实际模型.

        4、 不支持于DOM中相应遍历包.

适用:自行选择


  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值