JAVA中DefaultHandler

java中的DafaultHandler是解析xml文件时的处理类。虽然很多处理中都是用自定义的handler去解析,但是也是继承DefaultHandler的。在DefaultHandler中有几个比较重要的方法。

 

startDocument()         接收文档开始的通知。

characters(char[] ch, int start, int length)        接收元素中字符数据的通知。

ch - 字符。

start - 字符数组中的开始位置。

length - 从字符数组中使用的字符数。

 

endElement(String uri, String localName, String qName) 
          接收元素结束的通知

endDocument() 
          接收文档结束的通知。

startElement(String uri, String localName, String qName, Attributes attributes)

// 接收元素开始的通知

uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。

 

 

 

DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。如下:

  import org.xml.sax.*;

  import org.xml.sax.helpers.DefaultHandler;

  public class TestDefaultHandler extends DefaultHandler{

  public void startDocument() throws SAXException{

  System.out.println("开始解析!"); }

  public void endDocument() throws SAXException{

  System.out.println("解析完成!"); }

  public void startElement(String uri, String localName, String qName,

  Attributes atts) throws SAXException {

  System.out.println("元素名:"+qName);

  }

  public void endElement(String uri, String localName, String qName)

  throws SAXException{

  System.out.println("对"+qName+"的解析完成!");

  }

  }

 

 

详细过程

 

一: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文件

 

<?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方法。

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值