`
jiangjingxiaoxuan
  • 浏览: 33692 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

利用Digester把XML转换为Java对象

阅读更多

在一个比较完整的应用系统里,经常需要有一些配置文件。简单的属性使用.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对象

    ### 使用Digester将XML转换为Java对象 #### 概述 在软件开发过程中,特别是对于较为复杂的系统,配置文件的管理变得尤为重要。传统的配置文件如`.properties`仅能处理简单的键值对设置,而对于复杂的对象配置,则...

    xml转换java对象

    使用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

    ### Apache XML转换Java对象——Digester #### 一、引言 在软件开发过程中,XML是一种常见的数据交换格式。为了方便地将XML数据转换为Java对象,Apache Commons库提供了一个强大的工具——`Digester`。本文将详细...

    Digester java解析xml

    Java中的Digester库是Apache ...通过合理地利用其规则和特性,可以高效地将XML文档转化为易于操作的对象模型,极大地提高了开发效率。在实际项目中,了解并熟练掌握 Digester 的使用,对提升软件质量具有积极的意义。

    利用commons-digester解析xml

    Apache Commons项目中的Digester库提供了一种方便的方式来解析XML文件,将其转换为Java对象,这对于处理配置文件或者构建对象关系映射非常有用。本篇文章将深入探讨如何利用Apache Commons Digester库解析XML。 ...

    利用digester来将xml转换为bean

    5. **博文链接**:在阅读和实践过程中,可以参考以下博文获取更深入的理解:[《利用digester将xml转换为bean》](https://bazhuang.iteye.com/blog/188518)。这个链接提供了详细的示例代码和解释,有助于进一步学习和...

    digester解析xml的问题.pdf

    5. **对象模型的构建**:通过 Digester 解析后,XML 文档中的数据已经被转换成 Java 对象树,可以直接进行业务操作,如存储、计算或显示。 需要注意的是,Digester 的规则通常是基于元素的深度优先遍历顺序,所以 ...

    Digester读取XML学习

    Apache Commons Digester是一个强大的工具,它允许开发者将XML文件解析为Java对象,通过匹配XML元素规则来调用对象的方法或设置属性。本篇文章将深入探讨如何使用Digester进行XML解析,并提供相关的学习资源。 ...

    Digester读取xml教程.rar

    Digester与DOM、SAX、JAXB等其他XML解析库相比,更注重于将XML转换为Java对象,适合于需要频繁读写XML的场景。但在大型项目中,可能需要考虑其复杂性和维护性。 通过本教程,你应该对使用Apache Commons Digester...

    XML与Java对象互相转化Demo(Eclipse)

    此外,还可以使用第三方库如Apache Commons Digester或Castor来完成XML与Java对象的转化,它们提供了更灵活的配置和更强大的功能。 总结,这个示例项目主要教授了如何在Java中使用JAXB进行XML与Java对象的互转,这...

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

    - **XML数据绑定**:在处理XML格式的数据交换时,可以方便地将XML转换为Java对象模型。 - **简化对象构建**:在对象层级复杂,需要根据XML构建时,使用 Digester可以减少手动编码的工作量。 6. **最佳实践** - *...

    digester解析XML文件实例

    通过 Digester 的规则,XML文件的层级结构可以被转化为Java对象树。 5. **处理结果**:解析完成后,Java对象树已经构建完毕,你可以通过对象的引用来访问和操作数据。 在提供的"jiexi"文件中,应该包含了具体的...

    java反射,Digester解析xml文档

    **Digester** 是Apache Commons项目中的一个库,它专门用于解析XML文档,并基于规则将其转换为Java对象。Digester通过匹配XML元素结构来调用对象的方法或创建新对象,减少了手动解析XML的复杂性。这在配置驱动的Java...

    Java xml转化为map

    - Apache Commons Digester库提供了一种规则驱动的方式来将XML转换为Map,通过定义匹配规则,当匹配到XML中的某个模式时,它会调用相应的处理方法。 4. **自定义转换器**: - 如果XML结构复杂,也可以自定义转换...

    使用Apache的Digester来解析XML文档

    4. **配置Digester规则**:设置 Digester 规则以将XML解析为Java对象。这些规则通常在程序启动时初始化: ```java Digester digester = new Digester(); digester.setRulesValidation(true); // 启用规则验证 // ...

    使用Digester解析XML文档示例

    Digester能够根据定义好的规则自动将XML文档转换成Java对象,非常适合用在配置文件读取、数据交换等场景。 #### 二、Digester的基本原理 1. **SAX事件驱动**:Digester内部使用SAX事件模型来解析XML文档。当解析器...

    Digester的XML规则文件配置

    在Java开发中,Apache Commons Digester是一个非常实用的工具,它能够帮助开发者解析XML文件,并将其转换为Java对象模型。为了更好地利用这一工具,Digester提供了名为`org.apache.commons.digester.xmlrules`的包,...

    digester解析xml

    《digester解析XML详解》 ...总之,Digester为XML解析提供了便利,通过定义规则,可以将复杂的XML文档转换为易于操作的Java对象。熟练掌握这一工具,能够提高我们的开发效率,使XML处理更加得心应手。

    扩展PlugIn插件解析XML

    总之,"扩展PlugIn插件解析XML"是一个关于利用Java的Apache Commons Digester库解析XML文件并将其转换为Java对象的过程。这个过程中,我们定义接口来规范对象的行为,配置 Digester 实例来处理XML结构,并通过解析...

Global site tag (gtag.js) - Google Analytics