Java开发网 |
注册 |
登录 |
帮助 |
搜索 |
排行榜 |
发帖统计
|
您没有登录 |
» Java开发网 » Java程序分享区
打印话题 寄给朋友 订阅主题 |
作者 | using Jakarta commons-digester 简单实现XML JavaObject Mapping |
jamesfeng2
发贴: 41 |
于 2004-08-17 21:15
commons digester 是专门处理 xml configuration 配置文件的.我想大家对于 XML 的了解应该不会太陌生, 越来越多人开发程序使用的配置, 都用 xml 来撰写,但是呢, 每次都要通过 parser 来取得数据using DOM, SAX, 会觉得重复开发时间的浪费. commons digester 就是让你配置一个 XML 转到 Java Object 对应的程序, 当一些 XML 中特定的属性将会触发一些被称为 rules 的动作, 有一些属性是已经被定义好了, 当然你也可以建立自己所需要的. commons digester big advantage is using Matching Patterns, forget about parent/child relationships among tags. The pattern is datasources/datasource, datasources/datasource/name, datasources/datasource/driver, datasources/datasource/url,datasources/datasource/username, datasources/datasource/password. This is an easy and developer-friendly usage to precisely convey the tag to which you want to refer I demostrate how to use by following examples, we using: sample.xml, Datasource.java, Datasources.java, DigesterTest.java ------------------------------------------------------------------------------------------------------- Digester 通常是用在解析 XML 配置文件, 假如我们有这样的配置文件: sample.xml ======= <?xml version="1.0"?> <datasources> <datasource> <name>HsqlDataSource</name> <driver>org.hsqldb.jdbcDriver</driver> <url>jdbc:hsqldb:hsql://localhost</url> <username>jamesfeng2</username> <password>jamesfeng2</password> </datasource> <datasource> <name>OracleDataSource</name> <driver>oracle.jdbc.driver.OracleDriver</driver> <url>jdbc:oracle:thinlocalhost:1521:orcl</url> <username>scott</username> <password>tiger</password> </datasource> </datasources> Datasource.java will hold the details source we can set or get. ========== public class Datasource { private String name,driver,url,username,password; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setDriver(String driver) { this.driver = driver; } public String getDriver() { return driver; } public void setUrl(String url) { this.url = url; } public String getUrl() { return url; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } public String toString(){ StringBuffer buf = new StringBuffer(); buf.append("\t").append(name); buf.append("\t").append(driver); buf.append("\t").append(url); buf.append("\t").append(username); buf.append("\t").append(password); return buf.toString(); } } Datasources.java is a collection of Datasource.java and override toString() ========== public class Datasource { private String name,driver,url,username,password; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setDriver(String driver) { this.driver = driver; } public String getDriver() { return driver; } public void setUrl(String url) { this.url = url; } public String getUrl() { return url; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } public String toString(){ StringBuffer buf = new StringBuffer(); buf.append("\t").append(name); buf.append("\t").append(driver); buf.append("\t").append(url); buf.append("\t").append(username); buf.append("\t").append(password); return buf.toString(); } } DigesterTest.java is driver core class. 首先, 必须先建立 digester 的 instance by addObjectCreate(), 接著将你所需要的数据addCallMethod(), 放到 Digester 的对象堆叠中push(), 增加一些执行的规则addCallParam(), 最后就可以解析这个文件了parse(). ============== import org.apache.commons.digester.*; import java.io.*; public class Digesters { private Datasources datasource; private void init(Digester dgstr) { /* 当遇到datasources元素时创建一个datasources对象 */ dgstr.addObjectCreate("datasources", Datasources.class); /* 当遇到datasource元素时创建一个datasource对象 */ dgstr.addObjectCreate("datasources/datasource", Datasource.class); /* 当遇到datasources/datasource/name元素时,调用当前datasource对象的setName方法 */ dgstr.addBeanPropertySetter("datasources/datasource/name", "name"); /* 当遇到datasources/datasource/driver元素时,调用当前datasource对象的setDriver */ dgstr.addBeanPropertySetter("datasources/datasource/driver", "driver"); /* 当遇到datasources/datasource/url元素时,调用当前datasource对象的setUrl方法 */ dgstr.addBeanPropertySetter("datasources/datasource/url", "url"); /* 当遇到datasources/datasource/userName元素时,调用当前datasource对象的setUserName */ dgstr.addBeanPropertySetter("datasources/datasource/username", "username"); /* 当遇到datasources/datasource/password元素时,调用当前datasource对象的setPassword方法 */ dgstr.addBeanPropertySetter("datasources/datasource/password", "password"); /* 调用当前的datasources对象的addDtasource方法,参数为当前的datasource对象 */ dgstr.addSetNext("datasources/datasource", "addDatasource"); } private void print(){ System.out.println(datasource); } private void load(InputStream in) throws Exception{ Digester dgstr = new Digester(); init(dgstr); try { datasource =(Datasources)dgstr.parse(in); } catch (IOException e) { throw new Exception("Error whne"); } } public static void main(String []args) throws Exception{ Digesters digesters = new Digesters(); digesters.load(Digesters.class.getResourceAsStream("sample.xml")); digesters.print(); } } final result: =========== RSSDigester ======== RSS 在 Portal 中是非常常见到的 webservice 格式, 通常是一些新闻发布的标准, 相关的内容, 你可以使用 RssDigester 自己写 parse, 或利用已经实作好的 Channel, Image, Item, TextInput 等等. 先了解一下 RSS 的格式, 使用起来应该就可以得心应手 !! xmlrules 制定 Digester 中的 rules ======================= 当你打开原码目录中, org/apache/commons/digester/ 下有一个 digester-rules.dtd . 这个 DTD 文件就是在定义 Digester 该如何解析你传入的 XML 文件, 你也可以自己定义相关的 patterns , 写在 digester-rules.xml 中, 让 Digester 可以根据你的需要去解析数据. 这样做可以减少程序中, 必须特别写 addObjectCreate, addCallMethod 等等 method. 不过, 我还没有见到目前有任何 project 采用这种做法. <?xml version="1.0"?> <!DOCTYPE digester-rules SYSTEM "digester-rules.dtd"> <digester-rules> <object-create-rule pattern="*/foo" classname="Foo"/> <set-properties-rule pattern="*/foo"/> </digester-rules> 相关书目或相关文章 TheServerSide: http://www.theserverside.com/articles/article.tss?l=Digester IBM: http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html Jakarta Commons: http://jakarta.apache.org/commons/index.html Jakarta Commons Digester: http://jakarta.apache.org/commons/digester.html Simplify XML file processing with the Jakarta Commons Digester : http://jakarta.apache.org/commons/digester/api/index.html =================== SCJP,SCWCD,SCBCD |
作者 | Re:using Jakarta commons-digester 简单实现XML JavaObject Mapping [Re:jamesfeng2] |
jamesfeng2
发贴: 41 |
于 2004-08-17 21:29
I like it |
已读帖子 新的帖子 被删除的帖子 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |