java digester_使用Digester,对象和xml进行转换

***********Example.xml**********

Gonzo

gonzo@muppets.com

male

Kermit

kermit@muppets.com

kermie@acme.com

**********Person.java************

import java.util.HashMap;

import java.util.Iterator;

public class Person {

private int id;

private String category;

private String name;

private HashMap emails = new HashMap();

// 下面的两个方法的名字中set以后的部分,与的属性名字对映。当从xml文件中识别出的属性 时,如果有要求(即调用过addSetProperties方法),Digester会依据这种对映关系自动调用相应的方法。

public void setId(int id) {

this.id = id;

}

public void setCategory(String category) {

this.category = category;

}

//对name而言,因为其值来自标签的内容而非属性值,需要用addCallMethod指定识别后的要调用此方法(想自动调用也要可以,需要addBeanPropertySetter,参见第下一个例子)。

public void setName(String name) {

this.name = name;

}

//同name,此时还要一一指定addEmail的参数值的来源。

public void addEmail(String type, String address) {

emails.put(type, address);

}

public void print() {

System.out.println("Person #" + id);

System.out.println("  category=" + category);

System.out.println("  name=" + name);

for(Iterator i = emails.keySet().iterator(); i.hasNext(); ) {

String type = (String) i.next();

String address = (String) emails.get(type);

System.out.println("  email (type " + type + ") : " + address);

}

}

}

**********AddressBook.java***********

import java.util.LinkedList;

import java.util.Iterator;

public class AddressBook {

LinkedList people = new LinkedList();

public void addPerson(Person p) {

people.addLast(p);

}

public void print() {

System.out.println("Address book has " + people.size() + " entries");

for(Iterator i = people.iterator(); i.hasNext(); ) {

Person p = (Person) i.next();

p.print();

}

}

}

************AddressBookDigester*********

import org.apache.commons.digester.Digester;

/**

* Usage: java Example1 example.xml

*/

public class AddressBookDigester {

public static void main(String[] args) {

if (args.length != 1) {

usage();

System.exit(-1);

}

String filename = args[0];

// 创建一个Digester实例

Digester d = new Digester();

// 创建AddressBook实例,并将其压入栈顶。

AddressBook book = new AddressBook();

d.push(book);

// 增加规则

addRules(d);

// 处理输入的xml文件

try {

java.io.File srcfile = new java.io.File(filename);

d.parse(srcfile);

}

catch(java.io.IOException ioe) {

System.out.println("Error reading input file:" + ioe.getMessage());

System.exit(-1);

}

catch(org.xml.sax.SAXException se) {

System.out.println("Error parsing input file:" + se.getMessage());

System.exit(-1);

}

// 将解析出的地址数据打印出来

book.print();

}

private static void addRules(Digester d) {

// 当遇到时,创建类Person的一个实例,并将其压入栈顶

d.addObjectCreate("address-book/person", Person.class);

//  将标签的属性(attribute)与栈顶Person类对象的属性(property)设置方法根据各自的名字进行映射, (例如,将标签属性id与属性设置方法setId进行映射,将标签属性category与属性设置方法setCategory进行映射),然后将属性的值 作参数传递给执行相应的方法。

// 如果某标签属性没法通过名字找到相应的属性设置方法,则此标签属性被忽略(如example.xml中第一个的try属性)。

d.addSetProperties("address-book/person");

// 调用第二栈顶对象(AddressBook实例)的addPerson方法,以栈对象(Person实例)的对象为参数

d.addSetNext("address-book/person", "addPerson");

// 当遇到的子元素时,调用栈顶对象(Person实例)的setName方法。

// 此处addCallMethod方法的第一参数是规则,第二个参数是方法的名字,第三个是参数的数量(为0时,表示只有一个参数,且参数的值是元素的内容)

d.addCallMethod("address-book/person/name", "setName", 0);

//  当遇到的子元素时,调用栈顶对象(Person实例)的addEmail方法,addEmail 方法有两个参数,取值分别来自的属性type的值和本身的内容。

// 此处addCallParam方法的第一参数是规则,第二个参数是指明被调用方法(addEmail)参数的序号,第三个是参数为字符串时指属性的名字)

d.addCallMethod("address-book/person/email", "addEmail", 2);

d.addCallParam("address-book/person/email", 0, "type");

d.addCallParam("address-book/person/email", 1);

}

private static void usage() {

System.out.println("Usage: java Example1 example.xml");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值