使用Digester的感受
1.先导入jar包到工程中,至少有4个
commons-logging-1.1.1.jar
commons-beanutils.jar
commons-collections-3.2.jar
commons-digester-1.8.jar
2.根据XML文件建立所有的JavaBean对象
3.在程序中
A:新建Digester对象
Digester digester = new Digester();
B: 设置不检查XML文档合法性
digester.setValidating(false);
C:如果碰到某个元素,添加并创建这个对应的类,个人理解,应该把全部的类都加载进来,第一个参数是元素名,第二个参数是该类的全限定名。
digester.addObjectCreate("KPI_DEFINE", bean.Kpi_Define.class);
D:加载类后,如果碰到某个元素有属性的话,添加这个类的属性,第一个参数为碰到的元素,第二个参数为XML文档中的属性名,第三个参数为对应类中的属性名
digester.addSetProperties("KPI_DEFINE/UNIT_KPI_DETAIL/UNIT_KPI","ID","id");
F:如果再次碰到某个元素,就执行上级元素的某个方法,添加当前元素,第一个参数是这个元素,第二个参数是调用上一个元素(类)中的方法名
digester.addSetNext("KPI_DEFINE/UNIT_KPI_DETAIL/UNIT_KPI/DIM_INFO", "setDim_info");
注意事项:根据XML文档元素,一级一级的来,不要跳级
G:添加结束后,准备解析,先创建一个根元素的类对象,调用digester.parse("参数")方法,参数可以选2种中的一种。这个方法可以得到XML文档的根元素(对象)
Kpi_Define kd;
kd = (Kpi_Define) digester.parse(new File("C://basicKpiDefine.xml"));//文件方式,把XML文件发在C盘根目录下
kd = (Kpi_Define) digester.parse(this.getClass().getClassLoader().getResourceAsStream("basicKpiDefine.xml"));//IO流方式
4.基本能解析了
下面说说rule方式,就是通过一个rule.xml文件定义解析的模板,这样不需要加载那么多的元素了(适用于元素超多的复杂的情况)
1.同理导入jar
2.根据XML文件建立javabean
3.在程序中
A:需要新建一个rule.xml文件(名字随意)
B:最主要的就是用什么样的格式写出rule.xml,有几个特定标签需要大家熟悉一下
<digester-rules>:根标记,不可缺少
<pattern value="XXXXX">:元素,XXX是XML文档中的元素名,一模一样的,参数不用写元素的路径(即不需要写成"UNIT_KPI_DEFINE/UNIT_KPI"这个样子,直接写"UNIT_KPI"就可以)
<object-create-rule classname="写入类的全限定名" />:碰到上面那个标记,就创建这个对象,参数为类的全限定名,包名+类名
<set-next-rule methodname="setXXX或者addXXX方法" />:下次碰到这个元素调用的方法(当然这次也调用了参数中的方法),用于多个重复元素
<set-properties-rule>:这个元素是设置属性的标签(属性在标签内部定义的那种,例如:<student id="1" name="gl" />)两种用法:
第一种情况:如果类中的属性和标签中的属性大小写相同,可以这么用:
<set-properties-rule>
<alias attr-name="*" prop-name="*" />
<set-properties-rule>
第二种情况:如果类中的属性和标签的属性大小写不同的话,只能这么用:
<set-properties-rule>
<alias attr-name="ID" prop-name="id" />
<alias attr-name="NAME" prop-name="name" />
</set-properties-rule>
挨个赋值
------------------------------------------------------
还有几个标签,暂时没弄明白怎么回事,如果知道的,可以告诉我
<bean-property-setter-rule pattern="" propertyname=""/> :貌似是设置bean属性的,调用setter方法,但是我没用成功
<call-method-rule>:貌似是调用setter方法的,需要和下一个标签配合使用
<call-param-rule>:调用setter方法是需要传入的参数。
暂时这么理解的,如果又错误的请通知我一下,也好给大家弄个明白。
4.基本就可以写完rule.xml文档了,最后,我们载入这个规则,和载入要解析的XML文件
digester = DigesterLoader.createDigester(new File("c://rule.xml").toURL());//载入规则rule.xml文件,需要放在C盘根目录下,没找到更好的办法
this.kpi_define = (Kpi_Define) digester.parse(this.getClass().getClassLoader().getResourceAsStream("basicKpiDefine.xml")); //加载需要解析的XML文件,获得根元素
-----------------------------------------
在项目中:
1.一般读大的XML文件很慢,如果不经常改动的XML文件,可以使用单例模式,只读取一遍XML文档,重复使用,如果经常改变XML文档的话,那么就另写一个读新XML文档的方法(其实实现是一样的),效率会提高很多
2.不一定需要把所有元素都做成对象
3.如果用myEclipse写rule.xml文档的话,可以把dtd文件,导入到myeclipse中,在新建XML文档时候,选择DTD模板,在写rule.xml的时候就会有自动提示,非常方便和效率!具体导入如下
1.下载DTD文件,到本地
2.打开myeclipse(6.6为例,其他也一样),依次window->preferences->myeclipse enterprise workbench ->files and editors -> XML ->XML Catalog ->点击ADD按钮 ->选择catalog entry -> 在Location处选择 file system ,找到DTD文件 确定 -> 在key type中选择URI -> 在key中 把下载这个DTD的地址写上 -> ok 搞定
3.回到开发状态,新建XML文档的时候,选择 XML(basic Templates)->随便写个名字 点击next -> 选择create xml file from a DTD file 点击 next ->选择 select XML Catalog entry -> 找到你刚才定义的DTD文件,next-> 这个对话框是定义元素选项的,一般不用动(除非又特殊需求) -> finish完成即可