工作原理如下: Digester底层采用SAX(Simple API for XML)析XML文件,所以很自然的,对象转换由"事件"驱动,在遍历每个节点时,检查是否有匹配模式,如果有,则执行规则定义的操作,比如创建特定的Java对象,或调用特定对象的方法等。此处的XML元素根据匹配模式(matching pattern)识别,而相关操作由规则(rule)定义。
接下来以例子说明
1.解析xml文件 view.xml
<?xml version="1.0" encoding="UTF-8" ?>
<viewcache name="test">
<area info="area1">
<id>1098</id>
<parentId>1001</parentId>
<areaType>province</areaType>
<name>北京</name>
<ordering>1867</ordering>
</area>
<area info="area2">
<id>1099</id>
<parentId>1098</parentId>
<areaType>capital</areaType>
<name>北京</name>
<ordering>1868</ordering>
<phoneArea>010</phoneArea>
</area>
<area info="area3">
<id>4476</id>
<parentId>1099</parentId>
<areaType>county</areaType>
<name>北京市朝阳区</name>
<ordering>1869</ordering>
<phoneArea>010</phoneArea>
</area>
<area info="area4">
<id>4477</id>
<parentId>1099</parentId>
<areaType>county</areaType>
<name>北京市崇文区</name>
<ordering>1870</ordering>
<phoneArea>010</phoneArea>
</area>
<area info="area5">
<id>4478</id>
<parentId>1099</parentId>
<areaType>county</areaType>
<name>北京市大兴区</name>
<ordering>1871</ordering>
<phoneArea>010</phoneArea>
</area>
</viewcache>
2.ViewCache类
import java.util.ArrayList;
import java.util.List;
public class ViewCache {
public String viewName;
public List<Area> areas = new ArrayList<Area>();
public String getViewName() {
return viewName;
}
public void setViewName(String viewName) {
this.viewName = viewName;
}
public List<Area> getAreas() {
return areas;
}
public void setAreas(List<Area> areas) {
this.areas = areas;
}
public void addArea(Area area){
areas.add(area);
}
}
3.Area类
public class Area {
public String id;
public String parentId;
public String areaType;
public String name;
public String ordering;
public String phoneArea;
public String info;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getAreaType() {
return areaType;
}
public void setAreaType(String areaType) {
this.areaType = areaType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOrdering() {
return ordering;
}
public void setOrdering(String ordering) {
this.ordering = ordering;
}
public String getPhoneArea() {
return phoneArea;
}
public void setPhoneArea(String phoneArea) {
this.phoneArea = phoneArea;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
//测试解析方法用
public String setProperties(String id,String parentId,String areaType){
this.id = id;
this.parentId =parentId;
this.areaType = areaType;
return "id:"+id+",parentId:"+parentId+",areaType:"+areaType;
}
@Override
public String toString() {
return "id:"+id+",parentId:"+parentId+",areaType:"+areaType+",name:"+name
+",ordering:"+ordering+",phoneArea:"+phoneArea;
}
4.测试类
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class ViewMain {
public static void main(String[] args) throws IOException, SAXException {
// 建立一个Digester对象
Digester digester = new Digester();
//指定它不要用DTD验证XML文档的合法性——这是因为我们没有为XML文档定义DTD
digester.setValidating(false);
//创建一个模型对象,viewcache作为跟对象
digester.addObjectCreate("viewcache", ViewCache.class);
/*设置viewcache对象的属性,view.xml中的name对应ViewCache 属性 viewName;
如果属性多,可以调用digester.addSetProperties(pattern, attributeNames, propertyNames)方法*/
digester.addSetProperties("viewcache","name","viewName");
//创建下层节点模型对象
digester.addObjectCreate("viewcache/area", Area.class);
//设置属性 同上
digester.addSetProperties("viewcache/area","info","info");
//父节点和子节点直接的连接关系通过addSetNext方法实现。addArea为父节点类中的方法
digester.addSetNext("viewcache/area", "addArea");
/*解析子节点属性用addBeanPropertySetter方法,addBeanPropertySetter()是将子节点转换为对象的属性,
当对象的属性名和子节点的名字不一样时用来指定对象的属性名 */
digester.addBeanPropertySetter("viewcache/area/id", "id");
digester.addBeanPropertySetter("viewcache/area/parentId", "parentId");
digester.addBeanPropertySetter("viewcache/area/areaType", "areaType");
digester.addBeanPropertySetter("viewcache/area/name", "name");
digester.addBeanPropertySetter("viewcache/area/ordering", "ordering");
digester.addBeanPropertySetter("viewcache/area/phoneArea", "phoneArea");
//解析节点类中的方法通过addCallMethod,如果有参数,先在改方法中设置参数个数,再用addCallParam设置参数
digester.addCallMethod("viewcache/area", "setProperties", 3);
digester.addCallParam("viewcache/area", 0, "id");
digester.addCallParam("viewcache/area", 1, "parentId");
digester.addCallParam("viewcache/area", 2, "areaType");
File file = new File("D:/software/download/dubbo/sshDemo/src/com/sshdemo/executive/digister/view.xml");
ViewCache viewCache = (ViewCache)digester.parse(file);
List<Area> areas = viewCache.getAreas();
for(Area area : areas){
System.out.println("area number:"+area.getInfo());
System.out.println("area content:"+area.toString());
System.out.println("area method:"+area.setProperties("000", "999", "county"));
}
}
}
分享到:
相关推荐
Digester解析XML文件
java反射,Digester解析xml文档
使用Digester解析XML文档示例
这是一个JAVA工程,导入后可直接运行,主要演示如何用digester解析XML文件
使用Apache的Digester来解析XML文档,代码,有解析!
Digester解析XML问题.pdf
使用STRUTS的解析XML技术digester来解析多层嵌套的XML文件,简单易懂
使用digester配置rule.xml规则来解析自定义的xml文件
首先Digester是什么,它是用来解析xml文件的的工具,是jakarta开源项目下commons的一个子项目,它能让程序员更方便的解析xml文件,而不需要了解底层的工作细节。 Digester 解析xml文件 实例。
接口利用Digester类解析Xml文件为对象 个人感觉简单易懂,如有问题,还请多多指教。
测试利用Digester解析xml文件的java代码源码文件,包括:server.java、service.java、Engine.java、Listener.java和DigesterServer.java。
java 解析xml文件 digester 将xml转换为java数据 digester jar 包
我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出...
实现XML解析好方法,使用digester效果比DOM,SAX解析更有效。当然对于小文件尽量不用digester.
首先Digester是什么,它是用来解析xml文件的的工具,是jakarta开源项目下commons的一个子项目,它能让程序员更方便的解析xml文件,而不需要了解底层的工作细节。 如果要使用Digester作为xml文件的解析,请到jakarta...
digester解析xml的全套组件,分别为digester-1.8, collections-3.2, beanutils-1.7.0, logging- <br>1.1.1。4个包里的jar文件已放在了一起,方便使用者导入,使用者亦可通过前缀区别组件。另外,jar <br>和...
解析使用的xml文件在"参与者基础数据-4月.zip",sql语句就不贴了,如果是测试digester只需将dao层改一下,不要连接数据库,不同数据库创表好麻烦,如果需要存入数据库可以自行创建。
XML和JavaBean相互转化是一个非常有用的工作,用来读写xml的组件很多,比如dom4j, sax, JDom,Digester等,但是很多组件用起来很麻烦,今天给大家推荐一个超级简单的组件JOX, JOX是一套用户XML document和Java ...
Digester基于规则的XML文档解析,主要用于XML到Java对象的映射. commons-beanutils.jar 提供对Java 反射和自省API的包装. aspectjweaver.jar 用于在Spring 2.0中集成AspectJ AspectJ LTW织入器 ognl.jar OGNL是...
此项目是为了更深入的理解MVC模式以及Struts的工作流程而开发的,运用了第三方commons组件, commons-digester来解析xml文件,把配置信息全部封装成类,然后运用MVC的思想去做相应的操作.