SAX解析XML

本文深入探讨SAX解析XML的原理及应用,介绍SAXParserFactory、SAXParser和DefaultHandler核心类,解析步骤及DefaultHandler类中的回调方法。通过实际案例分析,理解SAX解析XML的实际执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、XML:

1、概念:extensive markup language(可扩展的标记语言)

XML是一种通用的数据存储和交换格式,与平台无关,与编程语言无关,与操作系统无关。给数据集成和交互提供了极大的便利。

将数据格式化成XML文件后,真正实现了数据跨平台的交互和共享。在不同语言中,xml的解析方式都一样。

2、XML的解析:xml parse

对xml文件进行阅读和分析,提取出希望的数据和数据属性。在android开发中,将xml解析后,把数据放进List<Map<String, Object>>集合中是我们的最终目的。

3、XML的解析方式:

  • DOM(document object model  :文档对象模型)借助文档树模型对xml文档进行分析
  • SAXsimple API for xml  :xml的简单API)利用事件流的形式解析XML

        SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。

        所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

  • PULL:利用事件流模型来解析XML

 

二、知识点回顾:

XML节点的分类:

1、文档节点

2、元素节点(起始元素节点终止元素节点

3、属性节点

4、文本节点

5、注释节点

 

三、SAX解析xml

(一)、核心类:

  1. SAXParserFactory
  2. SAXParser
  3. DefaultHandler

 

(二)、解析步骤:

  1. 创建SAXParserFactory类实例;
  2. 使用工厂来实例化一个SAXParser对象;
  3. SAXParser对象执行parse解析方法即可。

 

(三)、核心代码

  1. SAXParserFactory factory = SAXParserFactory.newInstance();
  2. SAXParser parser = factory.newSAXParser();
  3. parser.parse(new File(filePath) , new DefaultHandler());

 

 

(四)、DefaultHandler类中的回调方法(ContentHandler接口):

        只要为SAX提供实现ContentHandler接口的类,那么该类就可以得到通知事件(实际上就是SAX调用了该类中的回调方法)。

        因为ContentHandler是一个接口,在使用的时候可能会有些不方便,因此,SAX为其制定了一个Helper类:DefaultHandler,它实现了ContentHandler接口,但是其所有的方法体都为空,在实现的时候,只需要继承这个类,然后重写相应的方法即可。其中的抽象方法如下:

  • startDocument() 
  • startElement() 
  • endElement() 
  • characters() 
  • endDocument()

 

1、startDocument() :

        当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作,比如初始化List集合等;
2、endDocument() 

        和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作; 
3、startElement(String namespaceURI, String localName, String qName, Attributes atts) 

        当读到一个开始标签的时候,会触发这个方法。

  • namespaceURI就是命名空间;
  • localName是带命名空间前缀的标签名;
  • qName是不带命名空间前缀的元素节点名;
  • 通过atts可以得到所有的属性数据(包括属性名和相应的值);

 

【备注:】

        SAX的一个重要特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要自己来写程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。

 
4、endElement(String uri, String localName, String name) 

        这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。
5、characters(char[] ch, int start, int length) 

        这个方法用来获取一个元素起始节点和一个元素结束节点之间的文本节点的内容。第一个参数为文本节点的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。 

 

 

四、原理分析

(一)、XML文件

<?xml version="1.0" encoding="UTF-8"?>

<books>

 <book id="1">

  <bookname>《Java编程思想》</bookname>

  <price>85.5</price>

 </book>

 <book id="2">

  <bookname>《Android 学习手册》</bookname>

  <price>39.0</price>

 </book>

</books>

 

(二)、DefaultHandler类中的回调方法执行顺序【理论顺序】

  1. startDocument被执行了--- 
  2. startElement被执行了---qName:books 
  3. startElement被执行了---qName:book 
  4. startElement被执行了---qName:bookname 
  5. characters被执行了---content:《Java编程思想》 
  6. endElement被执行了---qName:bookname 
  7. startElement被执行了---qName:price 
  8. characters被执行了---content:85.5 
  9. endElement被执行了---qName:price 
  10. endElement被执行了---qName:book 
  11. startElement被执行了---qName:book 
  12. startElement被执行了---qName:bookname 
  13. characters被执行了---content:《Android 学习手册》 
  14. endElement被执行了---qName:bookname 
  15. startElement被执行了---qName:price 
  16. characters被执行了---content:39.0 
  17. endElement被执行了---qName:price 
  18. endElement被执行了---qName:book 
  19. endElement被执行了---qName:books 
  20. endDocument被执行了---

 

 

(三)、实际执行顺序

  1. startDocument被执行了---
  2. startElement被执行了---qName:books
  3. characters被执行了---content:
  4.  
  5. startElement被执行了---qName:book
  6. characters被执行了---content:
  7.  
  8. startElement被执行了---qName:bookname
  9. characters被执行了---content:《Java编程思想》
  10. endElement被执行了---qName:bookname
  11. characters被执行了---content:
  12.  
  13. startElement被执行了---qName:price
  14. characters被执行了---content:85.5
  15. endElement被执行了---qName:price
  16. characters被执行了---content:
  17.  
  18. endElement被执行了---qName:book
  19. characters被执行了---content:
  20.  
  21. startElement被执行了---qName:book
  22. characters被执行了---content:
  23.  
  24. startElement被执行了---qName:bookname
  25. characters被执行了---content:《Android 学习手册》
  26. endElement被执行了---qName:bookname
  27. characters被执行了---content:
  28.  
  29. startElement被执行了---qName:price
  30. characters被执行了---content:39.0
  31. endElement被执行了---qName:price
  32. characters被执行了---content:
  33.  
  34. endElement被执行了---qName:book
  35. characters被执行了---content:
  36. endElement被执行了---qName:books
  37. endDocument被执行了---

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值