设为首页收藏本站

数码鹭岛论坛

 找回密码
 注-册

QQ登录

只需一步,快速开始

搜索
查看: 22683|回复: 0
打印 上一主题 下一主题

Jakarta Common Digester 应用

[复制链接]
跳转到指定楼层
1#
发表于 2007-2-13 11:40:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
您需要登录后才可以回帖 登录 | 注-册

本版积分规则

小黑屋|手机版|Archiver|数码鹭岛 ( 闽ICP备20006246号 )  

counter

GMT+8, 2025-12-3 17:31 , Processed in 0.071787 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表