Jakarta Common Digester 应用

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

Jakarta Common Digester 应用


1 什么是 Common Digester

Jakarta Common Digester 是一套 XML to Object 的 API,它可以将XML文件转换为任意的Java对象,并且提供灵活的扩展接口。

2 原理

2.1 简单的例子

将以下 XML 文件构造成 ArrayList;

<?xml version="1.0" encoding="ISO8859_1"?>
<list>
 <bean id="1111" description="abc"/>
 <bean id="2222" description="bcd"/>
</list>

Bean 类

public class Bean
{
 private String id;
 private String description;
 public void setId(String id)
 {
  this.id = id;
 }
 public String getId()
 {
  return id;
 }
 public void setDescription(String description)
 {
  this.description = description;
 }
 public String getDescription()
 {
  return description;
 }

}

 

Digester Digester = new Digester();
Digester.addObjectCreate("list", ArrayList.class):
Digester.addObjectCreate("list/bean" Bean.class);
Digester.addSetProperties("list/bean");
Digester.addSetNext("list/bean", "add");
/*TODO: Load xml file as stream*/
InputStream is = null;
ArrayList list = (ArrayList) Digester.parse(is);


2.2 Digester 的处理过程 (Rule, XPath, Object Stack)

首先为 Digester 指明处理规则, 每种处理规则都要匹配 XPath,如下:

Digester.addObjectCreate("list", ArrayList.class):
Digester.addObjectCreate("list/bean" Bean.class);
Digester.addSetProperties("list/bean");
Digester.addSetNext("list/bean", "add");

注意,上述程序并不是处理 XML 文档,而且指明如何处理 XML 文档

然后,Digester 开始解析 XML 文档

Digester.parse(is);

Digester 遍历整个 DOM 树, 当遇到一个元素时,便找到与该元素路径匹配的 Rule,并调用这个 Rule 来处理该元素。
Rule 使用 Digester 的 Object Stack 来使用或存放中间处理过程产生的对象。当整棵数遍历完毕时,Object Stack
栈底的对象即为最后结果对象。

2.3 使用 Digester 内建的规则

ObjectCreate
SetNext
SetProperties
SetProperty
CallMethod
FactoryCreate

2.4 使用自定义的规则

对于第一个例子,不使用内建的规则,而使用自定的规则处理,用于演示自定义规则的用法

public class ListRule
 extends Rule
{
 public void begin(String namespace, String name, Attributes attributes) throws Exception
 {
  /*将一个新的 ArrayList 对象放入 Object Stack 中*/
  Digester.push(new ArrayList());
 }

}

public class BeanRule
 extends Rule
{
 public void begin(String namespace, String name, Attributes attributes) throws Exception
 {
  /*取出栈顶的对象,当处理该规则时,栈顶应该是 ArrayList*/
  ArrayList list = (ArrayList) Digester.peek();
  Bean bean = new Bean();
  bean.setId(attributes.getValue("id"));
  bean.setDescription(attributes.getValue("description"));
  list.add(bean);
 }
 
}

Digester Digester = new Digester();
Digester.addRule("list", new ListRule()):
Digester.addRule("list/bean" new BeanRule());
/*TODO: Load xml file as stream*/
InputStream is = null;
ArrayList list = (ArrayList) Digester.parse(is);

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值