工作原理如下: 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"));
}
}
}
分享到:
相关推荐
4. **解析XML文件**:使用Digester解析XML文件,并根据定义的规则创建Java对象。 #### 五、总结 通过上述介绍可以看出,Digester是一个非常有用的工具,它可以大大简化XML解析的过程。在实际开发中,尤其是处理...
本文将深入探讨如何使用Digester解析XML文件,以及在实际项目中如何应用。 首先,让我们了解什么是Apache Commons Digester。这是一个Java库,它的主要功能是读取XML文件,并基于一系列预先定义的规则(Rule),...
标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...
这个"digester解析XML文件实例"是一个很好的学习资源,帮助开发者理解如何在实际项目中运用Digester。 首先,我们要了解Digester的基本工作原理。Digester通过定义一系列规则(Rules),当解析到XML文档中特定的...
3. **解析 XML**:创建好 Digester 实例后,使用 `parse` 方法读取 XML 文件并执行预定义的规则。代码示例如下: ```java Digester digester = new Digester(); digester.setValidating(false); // 关闭验证,...
3. **解析XML**:使用 Digester 的 `parse()` 方法读取XML文件,根据预先定义的规则进行处理。 4. **结果处理**:最后,Digester会生成一个对象模型,代表了XML文档的内容。 以下是一个简单的 Digester 使用示例: ...
要使用Digester解析XML文档,首先需要创建一个 `org.apache.commons.digester.Digester` 类的实例,并配置必要的模式和规则,最后调用 `parse()` 方法。 以下是一个简单的示例代码: ```java import org.apache....
5. **解析XML**:最后,使用配置好的 Digester 对象解析XML文件: ```java Root root = null; try (InputStream is = new FileInputStream("path_to_xml_file.xml")) { root = digester.parse(is); } catch ...
这个“digester解析xml必备包.rar”包含了三个关键的jar包,它们是实现Digester功能所必需的。 1. **commons-logging-1.2.jar**:这是Apache Commons Logging库的版本1.2。它提供了一个抽象层,允许开发者使用多种...
这个“org.apache.commons.digester解析XML.rar”压缩包包含了一个测试工程,它演示了如何使用Digester库来解析XML文件并映射到Java对象上。下面将详细介绍这个库的功能、使用方法以及在实际开发中的应用。 1. **...
在示例代码中, DigesterDriver演示了如何配置 Digester来解析XML文件,创建`Catalog`对象并填充其`Book`和`Magazine`子对象,以及相关的`Article`对象。每个元素的属性通过`addBeanPropertySetter()`设置,而对象...
在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...
本篇文章将详细介绍如何使用`Digester`解析XML,以及在使用过程中需要的依赖库。 首先,`Digester`的核心功能是通过定义规则来将XML元素与Java对象的属性或方法关联,这样在解析XML时,可以自动创建和填充Java对象...
《digester解析XML详解》 在Java开发中,XML作为一种数据交换格式,广泛应用于配置文件、数据传输等场景。为了方便地将XML文档解析为Java对象,Apache组织提供了一个名为Digester的工具库,它允许开发者通过规则来...
Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...
**使用Digester解析XML并验证** 1. **设置 Digester 规则** 在使用Digester之前,我们需要定义一系列规则,告诉Digester在遇到XML文档的哪些元素时执行什么操作。这些规则通常涉及到创建新对象、设置对象属性或者...
本文将深入探讨如何通过接口和Digester类来解析XML文件,创建并填充Java对象。 首先,理解 Digester 类的工作原理是至关重要的。Digester 是一个规则驱动的XML解析器,它通过匹配XML文档中的模式(Pattern),执行...