`
xiushan
  • 浏览: 30644 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Digester解析XML为对象

阅读更多

digester组件简化了xml文件处理操作,能将xml文件按照事先确定的规则(采用编码形式或xml配置文件形式),映射成java对象。digester组件现在最新版本是2.0,它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本),还有需要jdk1.5.
基本概念
1. 在Digester的内部采用SAX来解析XML文件。为了能够正确的使用它,必须在解析之前进行相应的设置。同时,在解析xml文件的过程中,它使用Stack来保存和检索这个期间产生的对象.
2. 为了简化使用,它通过匹配模式来定位要解析的xml标签。匹配模式的例子如下:

<?xml version="1.0"?>
<students>
 <student>
 <name>Tom</name>
 <course>JSP</course>
 </student>
 <student>
 <name>Mary</name>
 <course>J2EE</course>
 </student>
</students>

 
每个标签与相应的匹配模式对应如下表:
标签              匹配模式
<students> students
<student>  students/student 
<name>     students/student/name
<course>   students/student/course
3. 使用匹配模式可以很方便的定位需要处理的元素,为了处理这些元素,需要定义处理规则。规则在匹配模式被找到时起作用。所有的规则都是从org.apache.commons.digester.Rule派生的。所有已定义的Rule对象,可以在org.apache.commons.digester中找到。
常用的规则:
- ObjectCreate,创建对象实例。
- SetProperties,将标签属性(Attribute)与要创建的对象的属性相关联。
- BeanPropertySetter,将标签所包含标签与要创建的对象的属性相关联。
- SetNext,设置遇到下一个标签时的动作。
- CallMethod,设置当匹配模式被找到时要调用的方法。
- CallParam,设置对应的callMethod中指定方法所需要的参数值。
基本使用
以正确的顺序调用Digester方法是成功使用Digester处理XML文件的关键。使用步骤如下:
1. 创建org.apache.commons.digester.Digester实例并配置,包括设置实现Digester Rule的对象。
2. 使用Digester的push方法在Digester使用的stack中放置一个初始对象。在解析xml文件的过程中,Digester使用stack来保存它所找到的对象。第一个对象在遇到第一个标签时被放置到stack中,当最后一个标签处理完毕时被弹出。为了最后能检索到这个对象,因此需要一个初始对象来保留一个指向它的引用。
3. 注册匹配模式和rule。
4. 调用parse来解析xml文件。
使用举例
1.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
 <student>
 <name>Tom</name>
 <course>JSP</course>
 </student>
 <student>
 <name>Mary</name>
 <course>J2EE</course>
 </student>
</students>

 
2.硬编码形式实现
Student类

package com.tongda.whl.digester;
public class Student {
 private String name;
 private String course;
 public void setName(String name){
  this.name=name;
 }
 public void setCourse(String course){
  this.course=course;
 }
 public String getName(){
  return this.name;
 }
 public String getCourse(){
  return this.course;
 }
}

 
处理类

package com.tongda.whl.digester;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.xmlrules.*;
import org.xml.sax.SAXException;
public class DigestTest {
 private Log log=LogFactory.getLog(this.getClass());
 private Vector students;
 public DigestTest(){
  students= new Vector(5);
 }
 public void addStudent( Student student){
  students.add( student);
 }
 public String toString(){
  return ((Student)students.get(0)).getName();
 }
 public void digest(){
  //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0
  //创建实例
  Digester digester= new Digester();
  //将初始对象压入digester的stack
  digester.push( this);
  //指明匹配模式和要创建的类
  digester.addObjectCreate( "students/student", Student.class);
  //设置对象属性
 // digester
  digester.addBeanPropertySetter( "students/student/name");
  digester.addBeanPropertySetter( "students/student/course");
  //当移动到下一个标签中时的动作
  digester.addSetNext( "students/student", "addStudent");
  try {
  //解析,xml文件放在classpath下
   DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml"));  
    log.info(ds);
  } catch (Exception e) {
  e.printStackTrace();
   }
 }
 public static void main(String args[]){
  DigestTest test=new DigestTest();
  test.digest();
 } 
}

 
结果显示:Tom
3.配置文件方式实现
 配置文件:studentsRule.xml
 

<?xml version="1.0" encoding="UTF-8"?>
<digester-rules>
	<pattern value="students">
		<object-create-rule classname="com.tongda.whl.digester.Students" />
		<set-properties-rule />
		<pattern value="student">
			<object-create-rule classname="com.tongda.whl.digester.Student" />
			<bean-property-setter-rule pattern="name" />
			<bean-property-setter-rule pattern="course" />
			<set-next-rule methodname="addStudent" />
		</pattern>
	</pattern>
</digester-rules>

 
Student类

package com.tongda.whl.digester;
public class Student {
 private String name;
 private String course;
 public void setName(String name){
  this.name=name;
 }
 public void setCourse(String course){
  this.course=course;
 }
 public String getName(){
  return this.name;
 }
 public String getCourse(){
  return this.course;
 }
}
Students类
package com.tongda.whl.digester;
import java.util.Vector;
public class Students {
  private Vector students;
  public Students(){
   students= new Vector(5);
 }
  public void addStudent( Student student){
   students.add( student);
  }
  public String toString(){
     return ((Student)students.get(0)).getName();
  }
}

 
处理类

package com.tongda.whl.digester;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.xmlrules.*;
import org.xml.sax.SAXException;
public class DigestTest {
 private Log log=LogFactory.getLog(this.getClass());
 public void digestByConfig(){
  Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml"));
  try {
  Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml"));
     System.out.println(a);
  log.info(a);
  } catch (IOException e) {
  e.printStackTrace();
 } catch (SAXException e) {
  e.printStackTrace();
 }
 }
 public static void main(String args[]){
  DigestTest test=new DigestTest();
  test.digestByConfig();
 } 
}

 
结果显示:Tom
注意
在使用Digester需要注意的地方:
- 调用顺序,正确的调用顺序才能得出正确的结果。方法调用顺序基本和标签在xml文件中的层次关系相对应。基本的顺序是:先创建对象;然后设置属性;随后处理子元素;最后设置遇到下一个元素所对应的动作。对于子元素的处理,是同样的过程。
- 正确的使用初始对象。对比上面2个例子,之所以在第一个例子中显示的调用了digester的push方法,其原因就在于我们并没有如第二个例子一样用xml的root元素创建一个实例。如果不显式的调用,我们将会丢失这个元素的引用,那么也就无法得到后续的对象。
- digester的addSetNex方法中所指定的方法实际上是包含匹配模式对应标签的父标签对应对象的方法。在上两个例子中addStudent,都是包含Student对象的那个对象的方法。对于第一个例子,是DigesterTest;对于第二个例子,是Students。而且它的位置通常是在创建对象语句组的最后,与addObjectCreate相对应。在这2个语句之间的代码中所指定的方法都是所创建对象的方法。而且它们的顺序与匹配模式所对应的标签的顺序必须是一致的。
- 使用配置文件来创建digester,这样会带来很大的灵活性。

分享到:
评论

相关推荐

    Digester解析XML的小例子(对象嵌套)

    使用STRUTS的解析XML技术digester来解析多层嵌套的XML文件,简单易懂

    digester 解析xml

    用xsd验证xml,将xml生成bean对象

    扩展PlugIn插件解析XML

    接口利用Digester类解析Xml文件为对象 个人感觉简单易懂,如有问题,还请多多指教。

    JOX实现XML和JavaBean相互转化

    许多时候需要用到XML来传输数据,实现了将XML转化为JAVA对象,而JAVA具有很容易操作的特点,从而成功绕过了XML解析问题。比如:在WebService有时需要传送JAVA对象,当定义相应的WSDL文件却较为麻烦,通过JOX可以将...

    框架中常用的jar包作用

    Digester基于规则的XML文档解析,主要用于XML到Java对象的映射. commons-beanutils.jar 提供对Java 反射和自省API的包装. aspectjweaver.jar 用于在Spring 2.0中集成AspectJ AspectJ LTW织入器 ognl.jar OGNL是...

    apache-commons源码及jar文件

    Commons-Digester 是一个 XML-Java对象的映射工具,用于解析 XML配置文件. Discovery Commons-Discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。. EL Commons-EL 提供在...

    web开发常用jar

    Apache Commons包中的一个,通过它可以很方便的解析xml文件生成java对象 aspectjrt.jar 和aspectjweaver.jar Annotation 方式实现 AOP commons-dbcp.jar commons-pool-1.2.jar DBCP数据库连接池 cglib-nodep...

    Jakarta commons docs API CHM 格式

    commons-digester XML 文件到 Java 对象的映射机制 commons-discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。 commons-el 提供在JSP2.0规范中定义的EL表达式的解释器. ...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-digester XML 文件到 Java 对象的映射机制 commons-discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。 commons-el 提供在JSP2.0规范中定义的EL表达式的解释器. ...

    达内java培训目录

    XML XML语法、XML解析(SAX、DOM)、Dom4j组件、Digester组件。 熟练掌握XML语法规则;理解DOM模型;熟悉Java对XML的各种解析方式。 实训项目三:T-DMS V2项目开发 第四阶段(以T-NetCTOSS电信计费系统贯穿) ...

    java开发常用jar包

    Apache Commons包中的一个,通过它可以很方便的解析xml文件生成java对象 aspectjrt.jar 和aspectjweaver.jar Annotation 方式实现 AOP commons-dbcp.jar commons-pool-1.2.jar DBCP数据库连接池 cglib-nodep-2.1_...

    Xanot an Xml to Object Mapper-开源

    Xanot是XOM(从Xml到Object Mapper)。 与众所周知的Apache Digester非常相似。 但是它使用了Java 5注释功能。 这样,这些类可以“告诉”解析器如何将xml数据映射到其对象模型中。

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    13.6 为什么必须要有一个host 111 13.7 应用程序1 111 13.8 Engine接口 112 13.9 StandardEngine类 112 13.10 StandardEngineValve类 112 13.11 应用程序2 113 第14章 Server与Service 114 14.1 概述 114 14.2 ...

    how-tomcat-works

    13.6 为什么必须要有一个host 111 13.7 应用程序1 111 13.8 Engine接口 112 13.9 StandardEngine类 112 13.10 StandardEngineValve类 112 13.11 应用程序2 113 第14章 Server与Service 114 14.1 概述 114 14.2 ...

Global site tag (gtag.js) - Google Analytics