用Digester简化XML配置文件处理
Jakarta Commons Digester是目前流行的、开放源码的XML文件处理实用软件包。本文简要介绍了Digester的功能,并且以一个程序来示范如何利用该软件简化原本复杂的XML配置文件的解析过程。
Apache小组的Jakarta项目下有许多知名的基于java的开放源码子项目,包括Tomcat,Ant,log4j,struts等等。相比之下,Jakarta Commons子项目在它们当中则属于知名度比较低的。该项目致力于提供可重用的java构件,例如:Commons BeanUtils, Commons DBCP 以及Commons Logging等。利用它们可以大大减少的一些乏味的重复编码工作。本文将重点介绍Commons Digester,它具有把XML文件映射到Java对象的能力。也许恰好她能解决你目前的问题呢!那么,请继续往下看吧。
需要注意的是:在启用Digester之前,你的classpath下必须已经安装了这些软件包:Digester ,BeanUtils, Collections, Logging,还有一个遵循SAX(Simple API for XML)2.0或JAXP(Java API for XML Parsing) 1.1规范的XML解析器。 有关Jakarta Commons所有的构件,以及两个合适的解析器Crimson和Xerces的链接可以在本文的相关资源中找到。
XML解析简介
总的来说,XML文件解析有2种基本方法。一种是DOM(Document Object Model)方法。采用DOM方法进行解析时,XML解析器读取整个XML文件并生成一个树状表达方式。另一个是使用SAX,它的特点是不需要遍历整个文件而是用事件驱动来解析文件。虽然DOM方法有时实现起来比较容易,但是与SAX方法相比速度更慢而且更耗资源。Digester构件通过为SAX事件提供高级的接口大大简化了SAX方法的解析过程。该接口隐含了大量XML文件处理的复杂的技术细节。使开发人员得以集中精力处理XML数据而不是花太多的时间在如何解析文件本身上。
Digester的几个重要概念
Digester引入了3个重要概念:元素匹配模式,处理规则以及对象栈。
元素匹配模式将处理规则与XML元素联系起来。以下是一个XML层次结构的元素匹配模式的例子。
<ccid_nobr>
</ccid_nobr>
每当发现一个匹配的模式,对应的处理规则就被激活。在上面的示例中,与'datasource/datasource'相关联的规则将会运行2次。
处理规则定义了发现匹配的模式时产生的行为。Digester模块已经预定了不少处理规则,自定义的处理规则可以通过扩展 org.apache.commons.digester.Rule类来实现。
对象栈用来保存处理规则所要处理的对象。对象可以由人为或处理规则压入和弹出对象栈。
使用Digester
Digester 时常用于解析XML配置文件,下面例子中的XML文件包含了用于创建DataSource池的配置信息。 其中DataSource是抽象类,拥有一个空的构造函数,多个get,set方法来存取字符串。
<ccid_nobr>
</ccid_nobr>
. 要使用Digester对之进行解析,首先我们要创建一个Digester类的实例,然后把所需的对象都压入到Digester对象栈中,设置一系列处理规则,最后,对文件进行解析。下面是一个例子:
<ccid_nobr>
</ccid_nobr>
在这个例子中,你可以看到,addObjectCreate()方法把一个ObjectCreateRule添加到'datasources/datasource'模式中。这样,ObjectCreateRule将创建一个新的DataSource类的实例并把它压入Digester的对象栈中。随后,addCallMethod()方法把CallMethodRule分别添加到两个模式中。结果是,CallMethodRule将调用位于对象栈顶部的对象的特定的方法,addCallMethod()的最后一个参数指定了传入该方法的参数数目,如果数目为0则匹配上的数据项内容将作为参数传入。(注:类ObjectCreateRule,CallMethodRule 都是Digester模块已定义的处理规则)
假如应用这个代码断来处理在前面提到的XML文件,将会发生以下结果:
· 一个新的DataSource类的实例将被创建并压入堆栈;
· 调用该实例的setName(String name)方法,参数值为'HsqlDataSource';
· 调用该实例的setDriver(String driver)方法,参数值为'OracleDataSource'。
在对'datasource'元素的处理结束后,对象从堆栈中弹出,文件剩余部分的解析重复以上过程。上面的例子存在一个问题,在对相关元素的处理结束后,ObjectCreateRule会弹出它创建的对象。因此,当Digester完成解析文件后,只有最后一次创建的对象被保留下来。解决这个问题也很容易,只要把对象在解析开始之前压入堆栈,随后调用该对象的某个方法来创建所需的任意对象。下面的类就是这个办法的一个演示:
<ccid_nobr>
</ccid_nobr>
在上面的SampleDigester类中,每当匹配到 'datasources/datasource'时都会自动调用addDataSource()方法。addCallParam()方法将匹配到的数据项内容作为传入addDataSource()方法的参数。在addDataSource()方法中,你就可以创建具体的DataSouce并把它添加入你的DataSource集合中去。
深入了解Digester
尽管Digester最初是为了简化对XML配置文件的解析而开发的。但是它也可以用在把XML文件映射到java对象的场合。本文只是对Digester的简要介绍。如果要深入了解Digester或Jakarta Commons 项目中的其他公共组件,可以访问Jakarta Commons的官方网站。另外,可以参考以下的相关资源,从这些开放源代码的项目应用中学习Digester的用法。
Apache小组的Jakarta项目下有许多知名的基于java的开放源码子项目,包括Tomcat,Ant,log4j,struts等等。相比之下,Jakarta Commons子项目在它们当中则属于知名度比较低的。该项目致力于提供可重用的java构件,例如:Commons BeanUtils, Commons DBCP 以及Commons Logging等。利用它们可以大大减少的一些乏味的重复编码工作。本文将重点介绍Commons Digester,它具有把XML文件映射到Java对象的能力。也许恰好她能解决你目前的问题呢!那么,请继续往下看吧。
需要注意的是:在启用Digester之前,你的classpath下必须已经安装了这些软件包:Digester ,BeanUtils, Collections, Logging,还有一个遵循SAX(Simple API for XML)2.0或JAXP(Java API for XML Parsing) 1.1规范的XML解析器。 有关Jakarta Commons所有的构件,以及两个合适的解析器Crimson和Xerces的链接可以在本文的相关资源中找到。
总的来说,XML文件解析有2种基本方法。一种是DOM(Document Object Model)方法。采用DOM方法进行解析时,XML解析器读取整个XML文件并生成一个树状表达方式。另一个是使用SAX,它的特点是不需要遍历整个文件而是用事件驱动来解析文件。虽然DOM方法有时实现起来比较容易,但是与SAX方法相比速度更慢而且更耗资源。Digester构件通过为SAX事件提供高级的接口大大简化了SAX方法的解析过程。该接口隐含了大量XML文件处理的复杂的技术细节。使开发人员得以集中精力处理XML数据而不是花太多的时间在如何解析文件本身上。
Digester引入了3个重要概念:元素匹配模式,处理规则以及对象栈。
元素匹配模式将处理规则与XML元素联系起来。以下是一个XML层次结构的元素匹配模式的例子。
<ccid_nobr>
<ccid_code><datasources> 'datasources' |
</ccid_nobr>
每当发现一个匹配的模式,对应的处理规则就被激活。在上面的示例中,与'datasource/datasource'相关联的规则将会运行2次。
处理规则定义了发现匹配的模式时产生的行为。Digester模块已经预定了不少处理规则,自定义的处理规则可以通过扩展 org.apache.commons.digester.Rule类来实现。
对象栈用来保存处理规则所要处理的对象。对象可以由人为或处理规则压入和弹出对象栈。
Digester 时常用于解析XML配置文件,下面例子中的XML文件包含了用于创建DataSource池的配置信息。 其中DataSource是抽象类,拥有一个空的构造函数,多个get,set方法来存取字符串。
<ccid_nobr>
<ccid_code><?xml version="1.0"?> |
</ccid_nobr>
. 要使用Digester对之进行解析,首先我们要创建一个Digester类的实例,然后把所需的对象都压入到Digester对象栈中,设置一系列处理规则,最后,对文件进行解析。下面是一个例子:
<ccid_nobr>
<ccid_code>Digester digester = new Digester(); |
</ccid_nobr>
在这个例子中,你可以看到,addObjectCreate()方法把一个ObjectCreateRule添加到'datasources/datasource'模式中。这样,ObjectCreateRule将创建一个新的DataSource类的实例并把它压入Digester的对象栈中。随后,addCallMethod()方法把CallMethodRule分别添加到两个模式中。结果是,CallMethodRule将调用位于对象栈顶部的对象的特定的方法,addCallMethod()的最后一个参数指定了传入该方法的参数数目,如果数目为0则匹配上的数据项内容将作为参数传入。(注:类ObjectCreateRule,CallMethodRule 都是Digester模块已定义的处理规则)
假如应用这个代码断来处理在前面提到的XML文件,将会发生以下结果:
· 一个新的DataSource类的实例将被创建并压入堆栈;
· 调用该实例的setName(String name)方法,参数值为'HsqlDataSource';
· 调用该实例的setDriver(String driver)方法,参数值为'OracleDataSource'。
在对'datasource'元素的处理结束后,对象从堆栈中弹出,文件剩余部分的解析重复以上过程。上面的例子存在一个问题,在对相关元素的处理结束后,ObjectCreateRule会弹出它创建的对象。因此,当Digester完成解析文件后,只有最后一次创建的对象被保留下来。解决这个问题也很容易,只要把对象在解析开始之前压入堆栈,随后调用该对象的某个方法来创建所需的任意对象。下面的类就是这个办法的一个演示:
<ccid_nobr>
<ccid_code>public class SampleDigester |
</ccid_nobr>
在上面的SampleDigester类中,每当匹配到 'datasources/datasource'时都会自动调用addDataSource()方法。addCallParam()方法将匹配到的数据项内容作为传入addDataSource()方法的参数。在addDataSource()方法中,你就可以创建具体的DataSouce并把它添加入你的DataSource集合中去。
尽管Digester最初是为了简化对XML配置文件的解析而开发的。但是它也可以用在把XML文件映射到java对象的场合。本文只是对Digester的简要介绍。如果要深入了解Digester或Jakarta Commons 项目中的其他公共组件,可以访问Jakarta Commons的官方网站。另外,可以参考以下的相关资源,从这些开放源代码的项目应用中学习Digester的用法。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步