java解析xml 之SAX 解析方式原理

来源:互联网 发布:mysql order by limit 编辑:程序博客网 时间:2024/05/29 18:49

  Java xml 数据的解析

HTTP 网络传输中的数据组织方式有三种:

1HTML 方式

2XML方式

3JSON 方式

XML :称为可扩展标记语言,他与HTML 一样,都是通用标记语言,XMLInternet环境中跨平台的,依赖与于内容技术,是目前处理结构化文档信息的有力工具,可扩展标记语言是一种简单的数据存储语言,使用一系列简单的标记描述数据。非常适合万维网的传输。

XML 的结构解析如下:

1:节点

2:元素

3: 属性和属性值。

 由于XML的扩展性强,致使它需要有稳定的基础规则来扩展,规则如下:

1:开始标签和结束标签匹配,

2:嵌套标签不能互相嵌套。

3:区分大小写。

Android解析的方式如下:

1DOM org.w3c.dom

“文档对象模型”方式,解析完的XML将生成一个树状的对象。

2SAX org.xml.asx

 以事件的形式通知程序,对XML进行解析。

3PULL 

类似于SAX 方式,程序以“拉取”方式对XML 进行解析。

SAX以事件流来解析,边读边触发事件函数完成解析,适用于较大的XMLDOM加载整个xml文件,最终在内存中创建一个DOM树,操作DOM节点比较简单。

DOM解析与SAX 区别

在处理DOM的时候,需要读入整个XML文档,然后在内存中创建DOM树,生成DOM树上的每个NODE对象,当文档比较小的时候,不会造成问题,当文档比较大的时候,处理DOM就会变得费时,特别是内存的需求,此时对于某些应用使用DOM将得不偿失,SAX则是解决这一问题的很好选择。

SAX  是事件驱动的,器不需要读入整个文档,文档的读入过程就是SAX的解析过程,事件驱动,是指一种基于回调机制的程序运行方法,在XML Reader 接受XML文档的过程,就进行解析,

实例:

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

<persons>

<person id = "1">

  <name>Jack</name>

  <tel>13673234578</tel> 

  <age>18</age>

 </person>

</persons>

 当XMLReader读到<persons>标签时,就会调用ContentHandler.startDocument()方法,并把标签名persons作为参数传递过去。在你实现的startElement()方法中需要做相应的动作,以处理当<persons>出现时应该做的事情。各个事件随着解析的过程(也就是文档读入的过程)一个个顺序的被抛出,相应的方法也会被顺序的调用,最后,当解析完成,方法都被调用后,对文档的处理也就完成了

下面为几个主要的方法:

 void characters(char[] ch, int start, int length):这个方法用来处理在XML文件中读到字符串,它的参数是一个字符数组,以及读到的这个字符串在这个数组中的起始位置和长度,我们可以很容易的用String类的一个构造方法来获得这个字符串的String类:String charencontered=new String(ch,start,length)
  void startDocument():当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
  void endDocument():当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。 
  void startElement(String namespaceuri, String localname, String qname, Attributes atts):当读到一个开始标签的时候,会触发这个方法

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

 (由于代码片段较多,不好粘出来,所以已经上传在我的博客中,想看的小伙伴可以看看,有问题还望能及时指出,共同进步 。微笑













0 0