`
朱秋旭
  • 浏览: 229864 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Digester解析Xml 原理

阅读更多

注:本文的内容没有涉及每个细节,希望读者可以在阅读的同时翻看源码,文章的内容为作者个人理解,希望达到抛砖引玉的效果。也希望可以得到大家的拍砖,多做交流。

 

提起xml解析,脑海里第一反应一定是Dom,SAX等方式,刚开始学习Java的时候我也是使用这两种方式进行解析,拿到一个Xml第一反应一定是“又要写if-else了”。在学习Tomcat过程中发现了一个组件Digester,用于解析xml可谓简洁方便。

Digester是Jakarta 子项目Commons下的一个模块,支持基于规则的对任意XML文档的处理。它最初是Structs项目的一部分,后因其通用性而划归Commons。

Digester作为组件中一个核心的类,我们首先观看一下他的类结构图:





从图中可以看到Digester继承自DefaultHandler, 间接实现了EntityResolver,ErrorHandler, DTDHandler, ContentHandler四个接口,熟悉SAX的朋友应该了解这几个接口的功能。由此可以看出Digester是基于SAX原理,假设我们自己基于SAX设计Digester,我们该处理哪些问题?
Xml的格式千变万化以及带来的解析方式的变化,这是首先需要的解决的问题.

1  Xml永远是用户的Xml,所以只有让用户通过Digester制定符合自身Xml的规则链,Digester提供一套完备的规则链制定方法。
2  解析方式的变化是由Xml格式的变化带来的,所以Digester使用Rule接口封装,一个规则对应一种处理方式,如果用户不满意当前提供的默认处理方式,可以实现Rule接口自定义处理方式。

以上两个问题有了解决思路,就解决了主思路问题,现在我们来看一下Digester中是如何把两个问题处理好的。

首先,Digester类中提供了一系列规则链的制定方法,注意在编写规则链之前需要先调用push方法,将xml文档的根元素压入栈中。


 
每个规则链制定方法都会调用addRule, 例如添加创建对象方法。



 
addRule方法会将xml的正则表达式表达规则,和当前对应的规则加入到rules变量中,rules的类型为接口类型,Digester程序中使用到的是其实现类BasesRule,类结构图如下图:


                                                               
 
通过registerRule方法,将当前规则和路径正则放入到RulesBase类中的HashMap cache 和 ArrayList rules 中。其中cache记录规则和路径正则表达式的一一对应关系,rules则记录了当前xml文件所涉及到的所有的规则。
Rule接口封装了SAX中经典的start,body,end方法。

 


                        
 

 

规则制定完毕之后则需要进入到解析的部分了。

 



 
 

调用Digester.parse 方法,则开始进行解析工作。parse中调用了configure方法,咋一看是进行配置信息的初始化工作,可是进入initialize方法之后发现,该方法并没有执行任何内容。查看注释明白一切,该方法提供延迟加载的钩子函数,同时Digester毫不吝啬的在注释中展示了可扩展性。



 
configure执行完毕后,进入核心的parser代码片段,getXMLReader方法中首先获取XmlParser,然后在获取XmlReader。由于之前介绍过Digester是基于SAX解析方式的,所以很容易想到SAXParserImpl类。SAXParserImpl类的构造方法中将xmlReader变量赋值为JAXPSAXParser类,则最终调用的parse方法为AbstractSAXParser类中的parse方法。



 

接下来就进入到我们熟悉的SAX模式解析Xml,这个我们就比较熟悉了,每次开始解析进入startElement,endElement, 而endElement方法中又包含调用每个规则的body方法和end方法。

 

                          
 
                   

个人觉得使用的是策略模式,然后调用到具体匹配的规则类中的实现方法。这种实现方法带来一个好处就是开发人员如果觉得Digester中提供的方法和规则实现类不足以满足个人要求,可以自定义Rule接口实现类完成需要的功能。

由于篇幅有限,将Digester的一部分内容进行了分析,还有需要细节需要大家学习的时候多去关注,比如Digester中每一层的调用之间都包含许多的校验,其中的设计模式也值得大家细心专研。建议大家订阅commons邮件列表,多和开发者交流。

如果文中有任何纰漏的地方,欢迎大家批评指正,欢迎拍砖。

Email:zqxjqka#gmail.com

QQ: 982080920

 

  • 大小: 6.5 KB
  • 大小: 33.2 KB
  • 大小: 7.7 KB
  • 大小: 4.8 KB
  • 大小: 18.7 KB
  • 大小: 22.9 KB
  • 大小: 13.8 KB
  • 大小: 11.9 KB
  • 大小: 9.5 KB
  • 大小: 21.9 KB
分享到:
评论

相关推荐

    利用commons-digester解析xml

    标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...

    使用Digester解析XML文档示例

    ### 使用Digester解析XML文档示例 #### 一、Digester简介与应用场景 Digester是Apache Jakarta项目下的一个工具类库,它简化了基于SAX(Simple API for XML)的XML解析过程。Digester能够根据定义好的规则自动将...

    digester解析XML文件实例

    这个"digester解析XML文件实例"是一个很好的学习资源,帮助开发者理解如何在实际项目中运用Digester。 首先,我们要了解Digester的基本工作原理。Digester通过定义一系列规则(Rules),当解析到XML文档中特定的...

    Digester解析XML

    ### Digester解析XML知识点详解 #### 一、Digester简介 **Digester** 是Apache Commons项目中的一个子项目,主要用于简化XML文档的解析工作。它建立在SAX的基础之上,通过定义一系列的模式(Pattern)和规则(Rule...

    org.apache.commons.digester解析XML.rar

    这个“org.apache.commons.digester解析XML.rar”压缩包包含了一个测试工程,它演示了如何使用Digester库来解析XML文件并映射到Java对象上。下面将详细介绍这个库的功能、使用方法以及在实际开发中的应用。 1. **...

    Digester解析XML的小例子(对象嵌套)

    在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...

    digester解析xml

    《digester解析XML详解》 在Java开发中,XML作为一种数据交换格式,广泛应用于配置文件、数据传输等场景。为了方便地将XML文档解析为Java对象,Apache组织提供了一个名为Digester的工具库,它允许开发者通过规则来...

    Digester java解析xml

    Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...

    XML的解析之——使用Digester

    总结一下,使用Apache Digester解析XML的优点在于它的灵活性和自动化。你可以根据XML结构自定义消化规则,让解析过程变得简单高效。此外,由于它是开源的,开发者可以查看源码,了解其工作原理,甚至扩展其功能。在...

    扩展PlugIn插件解析XML

    本文将深入探讨如何通过接口和Digester类来解析XML文件,创建并填充Java对象。 首先,理解 Digester 类的工作原理是至关重要的。Digester 是一个规则驱动的XML解析器,它通过匹配XML文档中的模式(Pattern),执行...

    digester包

    使用digester解析XML时,我们需要遵循以下步骤: 1. **初始化Digester**:创建一个Digester实例,并设置必要的属性,如命名空间处理、错误处理等。 2. **定义Rule**:创建Rule对象,这些对象定义了当XML文档中的...

    xml解析在java中的应用小程序

    本篇文章将深入探讨XML解析的原理以及在Java中的具体应用。 1. XML解析原理: XML解析主要分为两种方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器会将整个XML文档加载到内存中,形成一...

    浅析Digester

    2. **解析XML**:然后,Digester会读取XML文档,每当遇到与已配置规则匹配的元素时,就会执行相应的动作,如创建对象、设置属性等。 3. **堆栈管理**:在解析过程中,Digester维护了一个对象堆栈。当遇到嵌套元素时...

    commons-digester源码

    **Apache Commons Digester** 是一个Java库,它允许开发人员定义一套规则,这些规则可以解析XML文档,并根据这些规则在Java对象模型中创建和配置对象。这个库在处理XML到Java对象映射时非常有用,特别是在构建配置...

    Tomcat7启动分析(三)Digester的使用

    在Tomcat7的启动过程中,涉及到很多内部组件的初始化,其中`Digester`是一个重要的工具,用于解析XML配置文件,将XML结构映射为Java对象。本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `...

    commons-digester-2.0.rar源文件及jar文件

    《Apache Commons Digester 2.0:解析XML的利器》 Apache Commons Digester是一个Java库,主要用于将XML文档解析成Java对象。这个库的核心功能是根据预定义的规则(Rule)来读取XML文档,然后根据这些规则进行一...

    digester学习笔记

    4. **解析XML**:最后,使用`digester.parse()`方法解析XML文档,完成后,栈顶的对象通常是解析结果的根节点。 在提供的示例中,有两个JavaBean,Foo和Bar。Foo有一个名为addBar的方法,用于添加Bar对象,而Bar包含...

Global site tag (gtag.js) - Google Analytics