2015年06月16日 Java XML 浏览(347)

详解Java如何使用Digester将XML解析成Java对象

Digester底层采用SAX解析XML文件。它是Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件。通过它可以很方便的从xml文件生成java对象.你不用再象以前通过jdom或者SAX那样去读取一个个document对象

一、它依赖的工具包是:commons-digester。Maven pom依赖如下:

<dependency>
    <groupId>commons-digester</groupId>
    <artifactId>commons-digester</artifactId>
    <version>1.8</version>
</dependency>

二、这里我们定义一个XML文档,用于被Digester解析:

<?xml version="1.0" encoding="UTF-8"?>  
<root>  
    <student id="1" group="1">  
        <name>张三</name>  
        <sex>男</sex>  
        <age>18</age>  
        <birthday>1990-09-09</birthday>   
    </student>  
    <student id="2" group="2">  
        <name>李四</name>  
        <sex>女</sex>  
        <age>17</age>  
        <birthday>1990-10-10</birthday>  
    </student>  
</root>

三、定义节点的根对象,并定义根对象加入子节点对象的方法,这里是addStudent,见代码:

public class Root {
	public ListstudentList = new ArrayList();
	
	public void addStudent(Student student) {
		this.studentList.add(student);
	}
}

四、定义Student对象,它拥有root/student节点的属性和特点。代码如下:

public class Student {
	private Long id;
	private String group;
	private String name;
	private String sex;
	private Integer age;
	private String birthday;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getGroup() {
		return group;
	}
	public void setGroup(String group) {
		this.group = group;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
}

五、我们开始利用Digester配合Root、Student等JavaBean来解析这个XML文档,代码如下:

/**
 * @from www.everycoding.com
 * @Description:Java使用Digester解析XML转成JavaBean
 */
public class XmlDigesterTester {
	public static void main(String[] args) throws IOException, SAXException {
		// XML文件的路径
		String path = XmlJdomTester.class.getClassLoader().getResource("com/xml/student.xml").getPath();
		File input = new File(path);
		Digester digester = new Digester();
		// 初始化根对象Root(本案例的XML根目录命名为ROOT)
		digester.addObjectCreate("root", "com.xml.Root");
		// 将root节点上的属性全部注入到Root对象中。
		digester.addSetProperties("root");
		// 将所有匹配到的目录root/student转成javaBean对象Student(参见Student类)
		digester.addObjectCreate("root/student", "com.xml.Student");
		// 将节点root/student上的属性注入到Student对象中
		digester.addSetProperties("root/student");
		// 以下是root/student包含的节点根据名称映射,将节点值setter到对应的Student对象中。
		digester.addBeanPropertySetter("root/student/name");
		digester.addBeanPropertySetter("root/student/sex");
		digester.addBeanPropertySetter("root/student/age");
		digester.addBeanPropertySetter("root/student/birthday");
		// 将所有匹配root/student节点,转化成了Student对象后,传入Root对象的addStudent方法中(参见Root类)
		digester.addSetNext("root/student", "addStudent", "com.xml.Student");
		// 定义好了上面的解析规则后,就可以开始进行解析工作了
		Root root = (Root) digester.parse(input);
		// 打印输入生成的对象结构
		System.out.println(JSON.toJSONString(root));
	}
}

六、让我们来看看Digester解析XML成对象后,被转成Json字符串打印输出的结果:

{"studentList":[{"age":18,"birthday":"1990-09-09","group":"1","id":1,"name":"张三","sex":"男"},{"age":17,"birthday":"1990-10-10","group":"2","id":2,"name":"李四","sex":"女"}]}

总结:Digester比我们一般的Jdom、Dom、Xpath、Sax解析XML成对象要简单很多。节省了不少代码。

用户头像