在一个比较完整的应用系统里,经常需要有一些配置文件。简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件。一般用来读取xml文件的工具包有DOM、SAX和JDOM等,但用过的人都知道,它们属于比较底层的API,写起来代码量很大,而且如果修改了xml文件的格式,代码也要做大幅度的改动。Jakarta Commons项目里的Digester包,可以轻松实现xml文件到Java对象的转换,看下面这个例子。
在一个项目里,需要提供一些统计图,但图的内容暂时未能确定。所以我决定让图可以配置,所有定义保存在一个名为charts.xml(或国际化后的文件名如charts_zh_CN.xml,这里只考虑缺省语言)的文件内,下面是该文件的部分内容:
<?xml version="1.0" encoding="UTF-8" ?>
<charts>
<chart id="BarChart1" >
<title>统计图一</title>
<legendVisible>false</legendVisible>
<toolTipsVisible>true</toolTipsVisible>
<type>Bar</type>
<labelx>时间</labelx>
<labely>数据</labely>
<width>500</width>
<height>360</height>
<hql>select count(c),c.department.name from edu.pku.pub.aims.model.business.Client c group by c.department</hql>
<description></description>
</chart>
</charts>
可以看出,我为每个图定义了id、title、legendVisible等等属性,这些属性的意义都很明显,它们将影响统计图的数据和在页面中的表现。在程序里,我需要把这个文件里的定义读到一个注册表类ChartRegistry里,该注册表维护一个java.util.List类型的registry变量,其中每个元素是一个ChartConfig类。现在Digester该显示它的价值了。
为了方便使用Digester,我们让ChartConfig也具有统计图的每个属性(id、title、legendVisible等等),名称与charts.xml里的元素的属性(子元素)一一对应,并且都具有getter和setter方法,也就是说,ChartConfig是一个bean类。在ChartRegistry类里定义一个deregister()方法,它的作用是用Digester读入并解析指定的xml文件,代码如下;还有一个register()方法用来把ChartConfig对象加到registry里。
public void deregister(URL url) throws IOException,SAXException{
InputStream is = new FileInputStream(url.getFile());
Digester digester = new Digester();
digester.push(this);
digester.setValidating(false);
digester.addObjectCreate("charts/chart", ChartConfig.class);
digester.addSetProperties("charts/chart");
digester.addBeanPropertySetter("charts/chart/legendVisible");
digester.addBeanPropertySetter("charts/chart/toolTipsVisible");
digester.addBeanPropertySetter("charts/chart/title");
digester.addBeanPropertySetter("charts/chart/type");
digester.addBeanPropertySetter("charts/chart/labelx");
digester.addBeanPropertySetter("charts/chart/labely");
digester.addBeanPropertySetter("charts/chart/width");
digester.addBeanPropertySetter("charts/chart/height");
digester.addBeanPropertySetter("charts/chart/hql");
digester.addBeanPropertySetter("charts/chart/description");
digester.addSetNext("charts/chart","register");
digester.parse(is);
Collections.sort(registry);
}
基本上来说,Digester和SAX解析xml的过程很像,它的原理就是制定一些规则,在遍历每个节点时检查是否有匹配的规则,如果有就执行对应的操作。例如,上面的代码中,“digester.addObjectCreate("charts/chart", ChartConfig.class);”这一句的作用是告诉Digester:如果遇到匹配“charts/chart”形式的节点,就执行一个“对象创建”操作,创建什么对象呢,应该创建Class为“ChartConfig.class”的对象;类似的,addSetProperties()是告诉Digester将指定节点的属性全部映射到对象的属性,在这个例子里指的就是id属性;addBeanPropertySetter()是将子节点转换为对象的属性,这个方法还可以有第二个参数,当对象的属性名和子节点的名字不一样时用来指定对象的属性名;addSetNext()是说在遇到匹配节点后,对当前对象的父对象执行一个方法,参数是当前参数,对这个例子来说就是执行ChartConfig.register(ChartConfig)方法。因此这样构造得到的Digester会把charts.xml里的每个元素转换为一个ChartConfig对象,并register到ChartRegistry里。
顺利得到了ChartRegister对象,我就可以在程序里根据它的内容构造统计图了(统计图一般使用jfreechart来生成,这里就不赘述了)。与Digester具有类似功能的工具包其实还有不少,例如Caster、Jato等等,我没有实际使用过它们,但因为我对用过的Jakarta其他项目都很满意(例如BeanUtils、HttpClient,品牌效应?),所以一开始就选择了Digester:简单方便。
分享到:
相关推荐
### 使用Digester将XML转换为Java对象 #### 概述 在软件开发过程中,特别是对于较为复杂的系统,配置文件的管理变得尤为重要。传统的配置文件如`.properties`仅能处理简单的键值对设置,而对于复杂的对象配置,则...
使用Betwixt,你可以轻松地将这个XML转换为`Person`对象: ```java import org.apache.commons.betwixt.*; public class Main { public static void main(String[] args) throws Exception { BeanIntrospector ...
### Apache XML转换Java对象——Digester #### 一、引言 在软件开发过程中,XML是一种常见的数据交换格式。为了方便地将XML数据转换为Java对象,Apache Commons库提供了一个强大的工具——`Digester`。本文将详细...
Java中的Digester库是Apache ...通过合理地利用其规则和特性,可以高效地将XML文档转化为易于操作的对象模型,极大地提高了开发效率。在实际项目中,了解并熟练掌握 Digester 的使用,对提升软件质量具有积极的意义。
Apache Commons项目中的Digester库提供了一种方便的方式来解析XML文件,将其转换为Java对象,这对于处理配置文件或者构建对象关系映射非常有用。本篇文章将深入探讨如何利用Apache Commons Digester库解析XML。 ...
5. **博文链接**:在阅读和实践过程中,可以参考以下博文获取更深入的理解:[《利用digester将xml转换为bean》](https://bazhuang.iteye.com/blog/188518)。这个链接提供了详细的示例代码和解释,有助于进一步学习和...
5. **对象模型的构建**:通过 Digester 解析后,XML 文档中的数据已经被转换成 Java 对象树,可以直接进行业务操作,如存储、计算或显示。 需要注意的是,Digester 的规则通常是基于元素的深度优先遍历顺序,所以 ...
Apache Commons Digester是一个强大的工具,它允许开发者将XML文件解析为Java对象,通过匹配XML元素规则来调用对象的方法或设置属性。本篇文章将深入探讨如何使用Digester进行XML解析,并提供相关的学习资源。 ...
Digester与DOM、SAX、JAXB等其他XML解析库相比,更注重于将XML转换为Java对象,适合于需要频繁读写XML的场景。但在大型项目中,可能需要考虑其复杂性和维护性。 通过本教程,你应该对使用Apache Commons Digester...
此外,还可以使用第三方库如Apache Commons Digester或Castor来完成XML与Java对象的转化,它们提供了更灵活的配置和更强大的功能。 总结,这个示例项目主要教授了如何在Java中使用JAXB进行XML与Java对象的互转,这...
- **XML数据绑定**:在处理XML格式的数据交换时,可以方便地将XML转换为Java对象模型。 - **简化对象构建**:在对象层级复杂,需要根据XML构建时,使用 Digester可以减少手动编码的工作量。 6. **最佳实践** - *...
通过 Digester 的规则,XML文件的层级结构可以被转化为Java对象树。 5. **处理结果**:解析完成后,Java对象树已经构建完毕,你可以通过对象的引用来访问和操作数据。 在提供的"jiexi"文件中,应该包含了具体的...
**Digester** 是Apache Commons项目中的一个库,它专门用于解析XML文档,并基于规则将其转换为Java对象。Digester通过匹配XML元素结构来调用对象的方法或创建新对象,减少了手动解析XML的复杂性。这在配置驱动的Java...
- Apache Commons Digester库提供了一种规则驱动的方式来将XML转换为Map,通过定义匹配规则,当匹配到XML中的某个模式时,它会调用相应的处理方法。 4. **自定义转换器**: - 如果XML结构复杂,也可以自定义转换...
4. **配置Digester规则**:设置 Digester 规则以将XML解析为Java对象。这些规则通常在程序启动时初始化: ```java Digester digester = new Digester(); digester.setRulesValidation(true); // 启用规则验证 // ...
Digester能够根据定义好的规则自动将XML文档转换成Java对象,非常适合用在配置文件读取、数据交换等场景。 #### 二、Digester的基本原理 1. **SAX事件驱动**:Digester内部使用SAX事件模型来解析XML文档。当解析器...
在Java开发中,Apache Commons Digester是一个非常实用的工具,它能够帮助开发者解析XML文件,并将其转换为Java对象模型。为了更好地利用这一工具,Digester提供了名为`org.apache.commons.digester.xmlrules`的包,...
《digester解析XML详解》 ...总之,Digester为XML解析提供了便利,通过定义规则,可以将复杂的XML文档转换为易于操作的Java对象。熟练掌握这一工具,能够提高我们的开发效率,使XML处理更加得心应手。
总之,"扩展PlugIn插件解析XML"是一个关于利用Java的Apache Commons Digester库解析XML文件并将其转换为Java对象的过程。这个过程中,我们定义接口来规范对象的行为,配置 Digester 实例来处理XML结构,并通过解析...