`
gjs622520
  • 浏览: 41984 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Digester

阅读更多
看AjaxChat的时候看到Digester。自己也写了个程序测试一下。
student.xml:
<?xml version="1.0" encoding="UTF-8"?>
<teacher name="张三丰" course="java">
	<student name="王八" age="20" id="1" />
	<student name="张飞" age="22" id="2" />
	<student name="李世民" age="21" id="3" />
	<student name="李陵" age="22" id="4" />
	<student name="高工" age="23" id="5" />
	<student name="黄夺" age="24" id="6" />
	<student name="马球" age="25" id="7" />
	<student name="琚要" age="26" id="8" />
</teacher>


teacher.xml:
<?xml version="1.0" encoding="UTF-8"?>
<teachers>
<teacher name="张三丰" course="java">
	<student>
		<name>王八</name>
		<age>20</age>
		<id>1</id>
	</student>
	<student>
		<name>张飞</name>
		<age>22</age>
		<id>1</id>
	</student>
	<student>
		<name>李世民</name>
		<age>21</age>
		<id>3</id>
	</student>
	<student>
		<name>李陵</name>
		<age>22</age>
		<id>4</id>
	</student>
	<student>
		<name>高工</name>
		<age>23</age>
		<id>5</id>
	</student>
	<student>
		<name>黄夺</name>
		<age>24</age>
		<id>6</id>
	</student>
	<student>
		<name>马球</name>
		<age>25</age>
		<id>7</id>
	</student>
	<student>
		<name>琚要</name>
		<age>26</age>
		<id>8</id>
	</student>
</teacher>
<teacher name="李小龙" course="net">
	<student>
		<name>王八2</name>
		<age>20</age>
		<id>1</id>
	</student>
	<student>
		<name>张飞2</name>
		<age>22</age>
		<id>1</id>
	</student>
	<student>
		<name>李世民2</name>
		<age>21</age>
		<id>3</id>
	</student>
	<student>
		<name>李陵2</name>
		<age>22</age>
		<id>4</id>
	</student>
	<student>
		<name>高工2</name>
		<age>23</age>
		<id>5</id>
	</student>
	<student>
		<name>黄夺2</name>
		<age>24</age>
		<id>6</id>
	</student>
	<student>
		<name>马球2</name>
		<age>25</age>
		<id>7</id>
	</student>
	<student>
		<name>琚要2</name>
		<age>26</age>
		<id>8</id>
	</student>
</teacher>
</teachers>


package gjs.domain;

public class Student {
	private int id;
	private String name;
	private int age;
        //......
}

package gjs.domain;

import java.util.ArrayList;
import java.util.List;

public class Teacher {
	private String name;
	private String course;
	private List<Student> students=new ArrayList<Student>();

	public void addStudent(String name,String age, String id){
		Student s=new Student();
		s.setAge(Integer.valueOf(age));		
		s.setId(Integer.valueOf(id));
		s.setName(name);
		this.students.add(s);
	}

	public void addStudent(Student student){
		this.students.add(student);
	}	
        //......
}

package gjs.domain;

import java.util.ArrayList;
import java.util.List;

public class TeacherList {
	private List<Teacher> teachers=new ArrayList<Teacher>();
	public void addTeachers(Teacher teacher){
		this.teachers.add(teacher);
	}
	public List<Teacher> getTeachers() {
		return teachers;
	}

	public void setTeachers(List<Teacher> teachers) {
		this.teachers = teachers;
	}
}

package gjs.test;

import java.io.File;
import java.io.IOException;
import gjs.domain.Student;
import gjs.domain.Teacher;
import gjs.domain.TeacherList;
import org.apache.commons.digester.Digester;
import org.junit.Test;
import org.xml.sax.SAXException;
import static org.junit.Assert.*;
public class DigesterTest {
	
	/**
	 * 属性方式
	 */
	@Test public void testOne(){
		Digester digester=new Digester();
		//设置不进行合法性验证
		digester.setValidating(false);
		//当遇到<teacher>时创建一个Teacher对象,放入栈顶
		digester.addObjectCreate("teacher", Teacher.class);
		digester.addSetProperties("teacher");
		//当遇到<teacher>的子元素<student>时创建一个Student对象,放入栈顶
		digester.addObjectCreate("teacher/student", Student.class);
		//设置<student>的属性值,根据属性值调用相应的set方法
		digester.addSetProperties("teacher/student");
		//当再次遇到<student>时创建一个Student对象,放入栈顶,同时调用栈次顶的addStudent方法
		digester.addSetNext("teacher/student", "addStudent", "gjs.domain.Student");
		try {
			Teacher teacher = (Teacher)digester.parse(new File("src/student.xml"));
			assertEquals(8, teacher.getStudents().size());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}		
	}

	/**
	 * 子标签方式(设置Property方式一)
	 */
	@Test public void testTwo(){
		Digester digester=new Digester();
		digester.setValidating(false);
		//设置栈顶
		digester.push(new TeacherList());
		digester.addObjectCreate("teachers/teacher", Teacher.class);
		digester.addSetProperties("teachers/teacher");
		digester.addObjectCreate("teachers/teacher/student", Student.class);
		//子标签方式设置属性方法之一,第三个参数是第二个参数所指方法的参数个数
		digester.addCallMethod("teachers/teacher/student/name", "setName",1);
		digester.addCallMethod("teachers/teacher/student/age", "setAge",1);
		digester.addCallMethod("teachers/teacher/student/id", "setId",1);
		digester.addSetNext("teachers/teacher/student", "addStudent", "gjs.domain.Student");
		digester.addSetNext("teachers/teacher", "addTeachers", "gjs.domain.Teacher");
		try {
			TeacherList teacher = (TeacherList)digester.parse(new File("src/teacher.xml"));
			assertEquals(2, teacher.getTeachers().size());
			assertEquals("java", teacher.getTeachers().get(0).getCourse());
			assertEquals(8, teacher.getTeachers().get(0).getStudents().size());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 子标签方式(设置Property方式二)
	 */
	@Test public void testThree(){
		Digester digester=new Digester();
		digester.setValidating(false);
		//设置栈顶
		digester.push(new TeacherList());
		digester.addObjectCreate("teachers/teacher", Teacher.class);
		digester.addSetProperties("teachers/teacher");
		digester.addObjectCreate("teachers/teacher/student", Student.class);
		//子标签方式设置属性方法之二
		digester.addBeanPropertySetter("teachers/teacher/student/name");
		digester.addBeanPropertySetter("teachers/teacher/student/age");
		digester.addBeanPropertySetter("teachers/teacher/student/id");
		digester.addSetNext("teachers/teacher/student", "addStudent", "gjs.domain.Student");
		digester.addSetNext("teachers/teacher", "addTeachers", "gjs.domain.Teacher");
		try {
			
			TeacherList teacher = (TeacherList)digester.parse(new File("src/teacher.xml"));
			assertEquals(2, teacher.getTeachers().size());
			assertEquals("java", teacher.getTeachers().get(0).getCourse());
			assertEquals(8, teacher.getTeachers().get(0).getStudents().size());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 子标签方式 (callMethod callParam方式)
	 */
	@Test public void testFour(){
		Digester digester=new Digester();
		digester.setValidating(false);
		digester.push(new TeacherList());
		digester.addObjectCreate("teachers/teacher", "gjs.domain.Teacher");
		digester.addSetProperties("teachers/teacher");
		//当<student>时调用栈顶元素(Teacher)的addStudents却并不执行,等待addCallParam设置参数,3为参数个数,这里传入的参数是字符串。
		digester.addCallMethod("teachers/teacher/student", "addStudent" ,3);
		digester.addCallParam("teachers/teacher/student/name", 0);
		digester.addCallParam("teachers/teacher/student/age", 1);
		//这句之后即</student>才调用addStudents方法,并且如果再次遇到<student>重复。
		digester.addCallParam("teachers/teacher/student/id", 2);		
		digester.addSetNext("teachers/teacher", "addTeachers", "gjs.domain.Teacher");
		try {
			TeacherList teacher=(TeacherList)digester.parse(new File("src/teacher.xml"));
			assertEquals(2, teacher.getTeachers().size());
			assertEquals("java", teacher.getTeachers().get(0).getCourse());
			assertEquals(8, teacher.getTeachers().get(0).getStudents().size());
			assertEquals("李世民2", teacher.getTeachers().get(1).getStudents().get(2).getName());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}
}


分享到:
评论

相关推荐

    commons-digester3-3.2-API文档-中英对照版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    commons-digester.jar

    `commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...

    commons-digester-2.1.jar

    `commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...

    利用commons-digester解析xml

    标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...

    digester用法测试案例

    Digester是Apache软件基金会的Jakarta项目中的一个实用工具库,它主要用来解析XML文档,并根据预定义的规则自动创建和配置Java对象。这个工具在处理XML到Java对象映射时,极大地简化了代码,避免了手动解析XML的繁琐...

    Castor、digester实例

    Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和对象的序列化过程。在本文中,我们将深入探讨这两个库,以及如何通过实例来使用它们。 首先,让我们了解Castor。...

    Digester java解析xml

    Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...

    org.apache.commons.digester解析XML.rar

    Apache Commons Digester是一个Java库,专门用于将XML文档解析成对象结构。这个“org.apache.commons.digester解析XML.rar”压缩包包含了一个测试工程,它演示了如何使用Digester库来解析XML文件并映射到Java对象上...

    commons-digester3-3.2-API文档-中文版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    Digester读取xml教程.rar

    《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...

    digester组件简化了xml文件处理操作

    ### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...

    Digester两种解析方式

    在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来实例化、配置和关联Java对象。 Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和...

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

    在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...

    使用Apache_Commons_Digester

    ### 使用Apache Commons Digester开发指南 #### 概述 Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一...

    Jakarta-Common-Digester使用笔记

    Digester不是一个XML Parser,它只是对SAX更高层次上的一个封装使用Digester,将XML映射成javaBean. 我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用...

    commons-digester-1.8.1-API文档-中英对照版.zip

    赠送jar包:commons-digester-1.8.1.jar; 赠送原API文档:commons-digester-1.8.1-javadoc.jar; 赠送源代码:commons-digester-1.8.1-sources.jar; 赠送Maven依赖信息文件:commons-digester-1.8.1.pom; 包含...

    xml解析commons-digester的demo

    Apache Commons Digester是Java中一个强大的工具,它提供了方便的方式来解析XML文档,并将解析出的数据绑定到Java对象上,实现对象的自动创建和初始化。本示例将详细介绍如何使用Apache Commons Digester进行XML解析...

    digester解析xml必备包.rar

    这个“digester解析xml必备包.rar”包含了三个关键的jar包,它们是实现Digester功能所必需的。 1. **commons-logging-1.2.jar**:这是Apache Commons Logging库的版本1.2。它提供了一个抽象层,允许开发者使用多种...

    commons-digester-1.7.zip

    Commons Digester是一个强大的Java库,它允许开发人员根据XML文档中的模式规则来创建和操作对象。这个"commons-digester-1.7.zip"文件包含了Apache Commons Digester库的1.7版本,这是一个广泛用于处理XML到Java对象...

Global site tag (gtag.js) - Google Analytics