上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点!

    SAX(Simple API for XML),是指一种接口,或者一个软件包.

    首先我们应该知道SAX解析和dom解析的区别:

    dom是树结构解析,易于理解和开发,它可以随意访问文件所在的节点位置,易于修改,删除和查询。但对于dom文档过大时,则会解析较慢。

    而SAX解析是事件推动型,顺序读取文件的节点,且只能读取文档的内容,不能对文档的内容进行修噶,对文档的大小没有过多的限制,但开大复杂度较高,

    下面介绍一个SAX解析xml文档的几个关键步骤:

     (1)、创建XML解析处理器,即SAXParseFactory 的实例,

        SAXParserFactory factory = SAXParserFactory.newInstance();

  (2)、通过factory创建SAX解析器

        SAXParser parser = factory.newSAXParser();

      (3)、通过SAXParse 的实例,创建xml解析处理器。对文档进行解析,

        parser.parse(uri,handler)   方法有两个参数uri , handler对象,uri就是我们的文档的路径,

        接下来我们需要创建一个handler对象,我们创建一个Myhandler类,这个Myhandler类需要继承DefaultHandler类,

        Myhandler handler = new Myhandler();

               下面是我们的Myhandler的实例代码。

  1.   1 package com.imooc.handler;
  2.  
  3. import org.xml.sax.Attributes;
  4. import org.xml.sax.SAXException;
  5. import org.xml.sax.helpers.DefaultHandler;
  6.  
  7. /*
  8. * 解析xml处理器
  9. *
  10. * */
  11. public class Myhandler extends DefaultHandler{
  12. String value = null;
  13. /**
  14. * 用来标识解析开始
  15. */
  16. @Override
  17. public void startDocument() throws SAXException {
  18. // TODO Auto-generated method stub
  19. super.startDocument();
  20. System.out.println("SAX解析开始");
  21. }
  22.  
  23. /**
  24. * 用来标识解析结束
  25. */
  26. @Override
  27. public void endDocument() throws SAXException {
  28. // TODO Auto-generated method stub
  29. super.endDocument();
  30. System.out.println("SAX解析结束");
  31. }
  32.  
  33. /**
  34. * 解析xml元素
  35. */
  36. @Override
  37. public void startElement(String uri, String localName, String qName,
  38. Attributes attributes) throws SAXException {
  39. // TODO Auto-generated method stub
  40. super.startElement(uri, localName, qName, attributes);
  41. if (qName.equals("book")) {
  42. int num = attributes.getLength();
  43. for(int i = 0; i < num; i++){
  44. System.out.print("book元素的第" + (i + 1) + "个属性名是:"
  45. + attributes.getQName(i));
  46. System.out.println("---属性值是:" + attributes.getValue(i));
  47.  
  48. }
  49. }else if (!qName.equals("name") && !qName.equals("bookstore")) {
  50.  
  51. System.out.print("节点名是:" + qName + "---");
  52. }
  53. }
  54.  
  55. @Override
  56. public void endElement(String uri, String localName, String qName)
  57. throws SAXException {
  58. // TODO Auto-generated method stub
  59. super.endElement(uri, localName, qName);
  60.  
  61. }
  62.  
  63. @Override
  64. public void characters(char[] ch, int start, int length)
  65. throws SAXException {
  66. // TODO Auto-generated method stub
  67. super.characters(ch, start, length);
  68. value = new String(ch, start, length);
  69. if (!value.trim().equals("")) {
  70. System.out.println("节点值是:" + value);
  71. }
  72. }
  73.  
  74. }

      (4)、测试主程序入口

      

  1. public static void main(String[] args) {
  2.  
  3. SAXParserFactory factory = SAXParserFactory.newInstance();
  4.  
  5. try {
  6. SAXParser parser = factory.newSAXParser();
  7.  
  8. Myhandler handler = new Myhandler();
  9. parser.parse("books.xml", handler);
  10.  
  11. } catch (ParserConfigurationException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. } catch (SAXException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. }

    books.xml文件,

      

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <bookstore>
  3. <book id="1">
  4. <name>老人与海</name>
  5. <author>海明威</author>
  6. <year>1955</year>
  7. <price>45</price>
  8. </book>
  9. <book id="2">
  10. <name>书剑恩仇录</name>
  11. <year>1959</year>
  12. <price>24</price>
  13. <language>chinese</language>
  14. </book>
  15. </bookstore>

输出的结果为:

    

  1. SAX解析开始
  2. book元素的第1个属性名是:id---属性值是:1
  3. 节点值是:老人与海
  4. 节点名是:author---节点值是:海明威
  5. 节点名是:year---节点值是:1955
  6. 节点名是:price---节点值是:45
  7. book元素的第1个属性名是:id---属性值是:2
  8. 节点值是:书剑恩仇录
  9. 节点名是:year---节点值是:1959
  10. 节点名是:price---节点值是:24
  11. 节点名是:language---节点值是:chinese
  12. SAX解析结束

    这样我们就完成了最基本的SAX解析xml文档。

    总结:

    优点:对内存要求比较低,对文档中的部分数据来进行解析开发速度快,而且扩展能力强。

    缺点:用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂

        

浅谈用java解析xml文档(二)的更多相关文章

  1. 浅谈用java解析xml文档(四)

    继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使 ...

  2. 浅谈用java解析xml文档(三)

    接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作 ...

  3. 浅谈用java解析xml文档(一)

    关于xml本身的语法及使用的环境不多说了,网上有很多规则, 然对xml文档进行解析,一般分为四种解析方式,基于java官方文档的Dom 和Sax解析,还有就是基于 第三方jar包的 Jdom 和 Do ...

  4. java 解析XML文档

    Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...

  5. Java解析XML文档(简单实例)——dom解析xml

      一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...

  6. Java解析XML文档——dom解析xml

    一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...

  7. java解析xml文档(dom)

    DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...

  8. JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)

    使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...

  9. java 解析xml文档---通过XmlPullParser解析方式

    package com.zx; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayLi ...

随机推荐

  1. Android 数据存储相关

    Application使用总结:http://www.tuicool.com/articles/JVBja2 枚举 Map<>

  2. hadoop源码导入eclipse

    1,下载hadoop源码 下载链接 http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.2.0/   为2.2.0的源码, 也可以 ...

  3. [Orchard CMS系列] 创建主题(Writing a new theme)

    本文需要对Orchard CMS有基本了解. 开启模块 code generation 创建新的主题工程骨架 Codegen theme MyTheme 创建主题样式 src\Orchard.Web\ ...

  4. Java类的生命周期详解

    引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...

  5. A Tour of Go Exercise: Slices

    Implement Pic. It should return a slice of length dy, each element of which is a slice of dx 8-bit u ...

  6. oracle表数据误删还原

    首先,找到数据删除前的一个时间点. select timestamp_to_scn(to_timestamp('2013-10-12 8:30:00', 'YYYY-MM-DD HH24:MI:SS' ...

  7. Web- HTML网页颜色大全

    按色相的搭配分类 列举一些最为代表常见的颜色值,让你能快速的找到自己想要的代码 红色 #FFFFCC#CCFFFF#FFCCCC #99CCCC#FFCC99#FFCCCC #FF9999#99669 ...

  8. iOS开发-布局基础

    今天我学习了有关布局的知识,以下是我整理出来的需要注意的,也是我个人认为比较重要的细节. 一.自动约束 在我们设置好自动约束布局之后,有时会出现拖动滑动条,左边的Label会跟着放大缩小的问题. 这时 ...

  9. 博客转移到lyso.me

    博客转移到http://lyso.me :)

  10. 【20】宁以pass-by-reference-to-const替换pass-by-value

    1.首先理解需求,被调用方法修改了形参,如果期望在主调方法中的实参也发生变化,必须使用pass-by-reference.因为C++缺省情况下(继承C方式),以by-value传递对象,在被调方法中修 ...