分享
 
 
 

Jakarta Commons Digester 学习笔记

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一个简单的例子

假定有两个JavaBean如下,分别为Foo和Bar

package mypackage;

public class Foo {

public void addBar(Bar bar);

public Bar findBar(int id);

public Iterator getBars();

public String getName();

public void setName(String name);

}

public mypackage;

public class Bar {

public int getId();

public void setId(int id);

public String getTitle();

public void setTitle(String title);

}

用下面的xml文件进行配置

<foo name="The Parent">

<bar id="123" title="The First Child"/>

<bar id="456" title="The Second Child"/>

</foo>

用下面几行代码即可完成配置文件解析工作:

Digest解析代码

注释

Digester digester = new Digester();

digester.setValidating(false);

不进行XML与相应的DTD的合法性验证

digester.addObjectCreate("foo", "mypackage.Foo");

当遇到<foo>时创建一个mypackage.Foo对象,并将其放在栈顶

digester.addSetProperties("foo");

根据<foo>元素的属性(attribute),对刚创建的Foo对象的属性(property)进行设置

digester.addObjectCreate("foo/bar", "mypackage.Bar");

当遇到<foo>的子元素<bar>时创建一个mypackage.Bar对象,并将其放在栈顶。

digester.addSetProperties("foo/bar");

根据<bar>元素的属性(attribute),对刚创建的Bar对象的属性(property)进行设置

digester.addSetNext("foo/bar", "addBar", "mypackage.Bar");

当再次遇到<foo>的子元素<bar>时创建一个mypackage.Bar对象,并将其放在栈顶,同时调用第二栈顶元素(Foo对象)的addBar方法。

Foo foo = (Foo) digester.parse();

分析结束后,返回根元素。

Digester包中的例子

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

<address-book>

<person id="1" category="acquaintance" try="would be ignored">

<name>Gonzo</name>

<email type="business">gonzo@muppets.com</email>

<gender result="the whole tag would be ignored">male</gender>

</person>

<person id="2" category="rolemodel">

<name>Kermit</name>

<email type="business">kermit@muppets.com</email>

<email type="home">kermie@acme.com</email>

</person>

</address-book>**********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以后的部分,与<person>的属性名字对映。当从xml文件中识别出<person>的属性时,如果有要求(即调用过addSetProperties方法),Digester会依据这种对映关系自动调用相应的方法。

public void setId(int id) {

this.id = id;

}

public void setCategory(String category) {

this.category = category;

}

//对name而言,因为其值来自<name>标签的内容而非属性值,需要用addCallMethod指定识别<name>后的要调用此方法(想自动调用也要可以,需要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>时,创建类Person的一个实例,并将其压入栈顶

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

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

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

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

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

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

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

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

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

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

// 此处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");

}

}

运行结果如下(运行时可能需要xml-crimson,一个源sun的XML解析器,可到http://xml.apache.org/crimson/下载)

Address book has 2 entries

Person #1

category=acquaintance

name=Gonzo

email (type business) : gonzo@muppets.com

Person #2

category=rolemodel

name=Kermit

email (type business) : kermit@muppets.com

email (type home) : kermie@acme.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有