SAX解析与DOM解析的区别

1.SAX解析(Simple API for XML)

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

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

缺点:不能对结点做修改

适用:读取XML文件

 

 
  1. package cn.tedu;

  2. import java.util.ArrayList;

  3. import java.util.List;

  4.  
  5. import org.dom4j.Document;

  6. import org.dom4j.DocumentException;

  7. import org.dom4j.Element;

  8. import org.dom4j.io.SAXReader;

  9.  
  10. import cn.tedu.entity.Emp;

  11.  
  12. /**

  13. * 解析XML文档

  14. *

  15. */

  16. public class XMLReader {

  17. public static void main(String[] args) {

  18. SAXReader reader = new SAXReader() ;

  19. try {

  20. Document doc = reader.read("emplist.xml") ;

  21. //获取根元素

  22. Element root = doc.getRootElement() ;

  23. System.out.println(root.getName()) ;

  24. //获取子元素

  25. List<Element> list = root.elements() ;

  26. //用于保存雇员信息

  27. List<Emp> emps = new ArrayList<Emp>() ;

  28. for (Element e : list) {

  29. //获取属性

  30. String id = e.attributeValue("id") ;

  31. String name = e.elementText("name") ;

  32. int age = Integer.parseInt(e.elementText("age")) ;

  33. String gender = e.elementText("gender") ;

  34. double salary = new Double(e.elementText("salary")) ;

  35. Emp emp = new Emp(id, name, age, gender, salary) ;

  36. emps.add(emp) ;

  37. }

  38.  
  39. //遍历emps

  40. for (Emp emp : emps) {

  41. System.out.println(emp) ;

  42. }

  43. } catch (DocumentException e) {

  44. e.printStackTrace() ;

  45. System.err.println("文档解析失败");

  46. }

  47. }

  48. }


 

 

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、移植性差

适用:自行选择

 

 
  1. package cn.tedu;

  2.  
  3. import java.io.FileNotFoundException;

  4. import java.io.FileOutputStream;

  5. import java.io.IOException;

  6. import java.io.UnsupportedEncodingException;

  7. import java.util.ArrayList;

  8. import java.util.List;

  9.  
  10. import org.dom4j.Document;

  11. import org.dom4j.DocumentHelper;

  12. import org.dom4j.Element;

  13. import org.dom4j.io.OutputFormat;

  14. import org.dom4j.io.XMLWriter;

  15.  
  16. import cn.tedu.entity.Emp;

  17.  
  18. /**

  19. * 创建XML文档

  20. *

  21. */

  22. public class CreateXml {

  23. public static void main(String[] args) {

  24. //1.创建一个空文档对象Document

  25. Document doc = DocumentHelper.createDocument() ;

  26. //2.像Document对象中添加根元素

  27. Element root =doc.addElement("emplist") ;

  28. //3.按照预定的格式依次向根元素中添加子元素来完成文档结构

  29. //创建雇员信息

  30. List<Emp> list = new ArrayList<Emp>() ;

  31. Emp emp1 = new Emp("13" , "张三" , 14 , "男" , 9000.0) ;

  32. Emp emp2 = new Emp("14" , "李四" , 14 , "女" , 8000.0) ;

  33. list.add(emp1) ;

  34. list.add(emp2) ;

  35. //添加子元素

  36. for (Emp e : list) {

  37. Element emp = root.addElement("emp") ;

  38. emp.addAttribute("id" , e.getId()) ;

  39. emp.addElement("name").addText(e.getName()) ;

  40. emp.addElement("age").addText(e.getAge()+"") ;

  41. emp.addElement("gender").addText(e.getGender()) ;

  42. emp.addElement("salary").addText(e.getSalary()+"") ;

  43. }

  44. //4.创建XMLWriter

  45. XMLWriter writer = null ;

  46. try {

  47. writer = new XMLWriter(OutputFormat.createPrettyPrint()) ;

  48. writer.setOutputStream(new FileOutputStream("myemp.xml")) ;

  49. //5.将Document通过XMLWriter写成XML文档

  50. writer.write(doc) ;

  51. System.out.println("生成完毕!");

  52. } catch (UnsupportedEncodingException e1) {

  53. e1.printStackTrace();

  54. } catch (FileNotFoundException e1) {

  55. e1.printStackTrace();

  56. } catch (IOException e1) {

  57. e1.printStackTrace();

  58. } finally {

  59. if(writer != null) {

  60. try {

  61. writer.close() ;

  62. } catch (IOException e1) {

  63. e1.printStackTrace();

  64. }

  65. }

  66. }

  67. }

  68. }


 

 

 

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中相应遍历包.

适用:自行选择

--------------------- 作者:Hero_Ant 来源:CSDN 原文:https://blog.csdn.net/sinat_27170093/article/details/54173090?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值