项目中要用到解析配置文件的功能,google了一下,发现基本都是说用Digester的,正好工程中有这个jar包,所以可以用,研究了一下。Digester原来是struts1.x下面的jar,但由于解析xml到bean是个如此常用的功能,于是就分出来了,成为apache一个单独的项目了,它用纯java实现。试了一下,解析xml还是挺方便的。下面是我改写了官网提供的一个例子,基本覆盖常用的功能。
example.xml:
beans:
测试类:
简单说明一下,
1)当创建bean中的bean属性时,如AddressBook的Person对象,总是需要两步:
addObjectCreate
addSetNext
前者是告诉系统下面的元素会映射成一个对象,后者告诉系统用当前父对象的哪个方法将这个新的子对象添加进来,不能以addCallMethod代替,如果用了,会发现多个元素时,只有一个被添加了进去,原因我也不知道,文档讲得也不清楚.
2)读取attribute
两种办法,一种是addSetProperties(),它会用xml中的attribute来设置bean上同名的property,如果两者名字不同怎么办,如例中xml里是birth,而bean中叫birthDay,用第二种办法addSetProperties("address-book/person","birth","birthDay");
3)将元素文本设置给bean的property
我一般比较喜欢用addBeanPropertySetter,用addCallMethod也可以,不过要指定参数的个数,如果只有一个参数,那么个数用0表示,a little weird。
另外,addSetNestedProperties这个方法可以将一组元素按钮元素名设置给bean的property,如:
用addSetNestedProperties("address-book/person/address"),它会把这些子元素都作为property设置给address。
如果想给bean设置一个常量的属性,addCallMethod之后用addObjectParam即可。Digester一点儿也难,多动手练习就会明白。
是不是很简单?了解了原理,当xml结构变化时,可以简单地修改下代码就同步了,另外有种办法貌似是用xmlbeans,用annotation实现的,在一个项目中见过,不过没研究过。
官方例子:
http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/examples/
需要的其它jar包,commons-logging,BeanUtils
如果想使用日志,定义个commons-logging.properties文件,附上以下内容:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
org.apache.commons.logging.simplelog.log.org.apache.commons.digester.Digester=debug
org.apache.commons.logging.simplelog.log.org.apache.commons.digester.Digester.sax=info