sax中DefaultHander解析xml过程和先后顺序

本文讲解三点:1. sax中DefaultHandler解析XML总体过程  2. sax中DefaultHandler解析XML非根node的先后顺序 3. sax中DefaultHandler解析XML根node先后顺序 (三点 均通过实际程序测试出来,程序见下文)

一:sax中DefaultHandler解析XML总体过程

        startDocument--->具体读到某个node(非根node和根node)的解析过程 --->endDocument 。

二:DefaultHandler 解析XML 的非根node是按顺序的 四步 (不管当前node是ElementNode[可有属性]还是TextNode)(非根node本测试程序如 person,name,age):

        第一步:startElement.   (eg:startElement localName :  qName : age)

        第二步 :  characters       (eg:characters in age = 25) 

        第三步 :  endElement     (eg: endElement in )

        第四步 :  characters       (eg: characters in null =  !)

三:DefaultHandler 解析XML 的根node是按顺序的 三步 (本测试程序中根node为 persons):

        第一步:startElement.   (eg:startElement localName :  qName : persons)

        第二步 :  characters       (eg:characters in persons =             !) 

        第三步 :  endElement     (eg:endElement in )        

---------------------------------------------------------------------------------------------------------------------------------------

使用org.sax.helper.DefaultHandler 解析XML ,一般会调用以下六个方法,需要你重写。

1. 开始解析xml文档 startDocument

2. 读到某个节点 startElement-->characters-->endElement-->characters  (endElement后会再调用一次characters方法)    

3. 解析xml文档结束 endDocument  

---------------------------------------------------------------------------------------------------------------------------------------

org.sax.helper.DefaultHandler 解析XML 的算法思路(自己理解的)

对每一个 非根节点 node都要进行两项检查:1.检查是不是ElementNode(用startElement方法) ; 2.是不是TextNode(用characters方法),遇到当前节点结尾时,调用endElement和characters方法。最关键的一句话:DefaultHandler会自动解析到下个节点,通过调用startElement方法。并把最新解析到的节点名称放在startElement(Strng url , Sting localName , String qName , Attributes attributes) 的qName中。

---------------------------------------------------------------------------------------------------------------------------------------

测试程序:

客户端eclipse读取服务器端myeclpse的myhttp工程根目录下的persons.xml文件

persons.xml

<?xml version = "1.0" encoding = "UTF-8">
<persons>
	<person id="23">
		<name>黄老师</name>
		<age>26</age>
	</person>
	<person id="25">
		<name>杨老师</name>
		<age>28</age>
	</person>
</persons>

客户端程序运行结果:

--startDocument--
startElement localName: qName:persons
characters in persons=
	!
startElement localName: qName:person
characters in person=
		!
startElement localName: qName:name
characters in name=黄老师!
endElement in 
characters in null=
		!
startElement localName: qName:age
characters in age=26!
endElement in 
characters in null=
	!
endElement in 
characters in null=
	!
startElement localName: qName:person
characters in person=
		!
startElement localName: qName:name
characters in name=杨老师!
endElement in 
characters in null=
		!
startElement localName: qName:age
characters in age=28!
endElement in 
characters in null=
	!
endElement in 
characters in null=
!
endElement in 
--endDocument--
{name=黄老师, id=23, age=26}
{name=杨老师, id=25, age=28}

1.分析对每一个 非根节点 都会按顺序触发4个方法,如<age>和<person>;

对于<age>这个节点很直观可以看到,对于<person>其实也是如此,以person为黄老师为例: 刚开始解析到person节点(即 解析到<person>时),触发startElement和characters;当遍历完 name 和 age节点 到达</person> 时,触发了 endElement 和 characters方法

2.而对于 根节点 <persons>只触发前三个方法,而不触发最后一个characters方法。

因为xml文档必须包含一个根节点,且只能包含一个根节点,即本xml的根节点为<persons>具有唯一性,所以当解析遇到</persons>时会知道整个xml文档已经解析完毕,所以不会触发characters方法。而是在endElement后直接触发endDocument方法。

posted @ 2016-11-03 16:26  星火spark  阅读(233)  评论(0编辑  收藏  举报