设为首页 收藏本站
查看: 518|回复: 0

[经验分享] Apache jakarta commons Digester用法

[复制链接]

尚未签到

发表于 2017-1-3 06:55:33 | 显示全部楼层 |阅读模式
XML已经成为了我们开发过程中不可缺少的技术。我们可以用它来描述程序的配置,适配不同的数据格式,甚至作为数据库使用。
帮助处理XML的工具很多,它们让我们活得更轻松。JakartaCommons下的Digester就是一个不错的工具。它提供了一种将XMLJava对象进行映射的方便方法。这么说可能让新手更迷惑,还是举个例子吧!
我们有这样一个XML文件:
1.
2. <!--Memos_2004-01-16.xml-->
3. <?xmlversion="1.0"?>
4. <memos>
5. <memo>
6. <title>AboutJakatarcommonsDigester</title>
7. <date>2004-01-1602:05</date>
8. <body>WeareworkingonDigester1.6-dev.Becauseitsupportedread
9. attributesofelement.Weshouldpayattentiontothereleasingof
10.Digesterforitschanging.</body>
11.</memo>
12.
13.<memo>
14.<title>Ahha!It'sgoodnight!</title>
15.<date>2004-01-164:19</date>
16.<body>Ihasenhancedthebasicframeworkofmyappwithimproved
17.architectureandperformance.It'stimetosleep.Goodnight,
18.boys.</body>
19.</memo>
20.</memos>
这是我的备忘录,我用xml作为数据库。现在我们想用Java程序来读/写这个数据库应该怎么做呢?啊!对了,SAXDOM……,好了,忘了它们吧!我们有更Easy的办法!
我们先来创建一个Memo类,它用来保存一条Memo。它有三个属性用来保存标题、日期以及Memo的正文。我们提供了公共的SetterGetter,并且我们重载了toString()方法以便查看运行结果
1.
2. /*Memo.java*/
3. packagekitta.memo;
4.
1. publicclassMemo
2. {
3. /*-----/InstanceField(s)/------------------------------------------------*/
4. privateString_title;
5. privateString_body;
6. privateString_date;
7. /*-----/Constructor(s)/---------------------------------------------------*/
8. publicMemo()
9. {
10./*donothingnow*/
11.}
12.
13./*-----/Getter(s)&Setter(s)/--------------------------------------------*/
14.publicStringgetBody()
15.{
16.return_body;
17.}
18.
19.publicvoidsetBody(Stringbody)
20.{
21._body=body;
22.}
23.
24.publicStringgetTitle()
25.{
26.return_title;
27.}
28.
29.publicvoidsetTitle(Stringtitle)
30.{
31._title=title;
32.}
33.
34.publicStringgetDate()
35.{
36.return_date;
37.}
38.publicvoidsetDate(Stringdate)
39.{
40._date=date;
41.}
42./*-----/OverridedMethod(s)/----------------------------------------------*/
43.publicStringtoString()
44.{
45.StringBufferbuf=newStringBuffer();
46.buf.append("/t").append(_title);
47.buf.append("/tat/t").append(_date).append("/n/n");
48.buf.append("/t").append(_body).append("/n");
49.buf.append("-----------------------------------------------------------/n");
50.returnbuf.toString();
51.}
52.}
然后是Memos类,它实际上是一个Memo对象的集合,完全可以用一个Collection的子类去代替它,但是这里之所以还是使用它主要是为了概念上的清晰。它同样很简单,一个私有属性_memos用来保存所有Memo对象的实例,一个共有方法addMemo()用来添加MemotoString()方法的目的同上。
1. /*Memos.java*/
2. packagekitta.memo;
3.
4. importjava.util.Collection;
5. importjava.util.Iterator;
6. importjava.util.Vector;
7.
8.
9. publicclassMemos
10.{
11./*-----/InstanceFields/--------------------------------------------------*/
12.privateCollection_memos=newVector();
13./*-----/Constructor(s)/---------------------------------------------------*/
14.publicMemos()
15.{
16./*donothing*/
17.}
18./*-----/Getter(s)&Setter(s)/--------------------------------------------*/
19.publicvoidaddMemo(Memomemo)
20.{
21._memos.add(memo);
22.}
23./*-----/OverridedMethod(s)/----------------------------------------------*/
24.publicStringtoString()
25.{
26.StringBufferbuf=newStringBuffer();
27.buf.append("-----------------------------------------------------------/n");
28.buf.append("MemoApplication/n");
29.buf.append("(").append(_memos.size()).append("memostotalfound.)/n");
30.buf.append("-----------------------------------------------------------/n");
31.
32.for(Iteratoritr=_memos.iterator();itr.hasNext();)
33.{
34.Memom=(Memo)itr.next();
35.buf.append(m.toString());
36.}
37.returnbuf.toString();
38.}
39.}
请注意init方法,它告诉Digester如何将XML中的数据映射到我们的Java对象。
1.
2. packagekitta.memo;
3.
4. importjava.io.IOException;
5. importjava.io.InputStream;
6.
7. importorg.apache.commons.digester.Digester;
8.
9. publicclassMemoApp
10.{
11./*-----/InstanceField(s)/------------------------------------------------*/
12.privateMemos_memos;
13./*-----/Constructor(s)/---------------------------------------------------*/
14.publicMemoApp()
15.{
16./*donothing*/
17.}
18./*-----/PrivateMethods(s)/-----------------------------------------------*/
19./**
20.*InitializestheinstanceofDigester.
21.*/
22.privatevoidinit(Digesterdgstr)
23.{
24./*当遇到memos元素时创建一个Memos对象*/
25.dgstr.addObjectCreate("memos",Memos.class);
26./*当遇到memo元素时创建一个Memo对象*/
27.dgstr.addObjectCreate("memos/memo",Memo.class);
28./*当遇到memos/memo/title元素时,调用当前Memo对象的setTitle方法*/
29.dgstr.addBeanPropertySetter("memos/memo/title","title");
30./*当遇到memos/memo/body元素时,调用当前Memo对象的setBody*/
31.dgstr.addBeanPropertySetter("memos/memo/body","body");
32./*当遇到memos/memo/date元素时,调用当前Memo对象的setDate方法*/
33.dgstr.addBeanPropertySetter("memos/memo/date","date");
34./*调用当前的Memos对象的addMemo方法,参数为当前的Memo对象*/
35.dgstr.addSetNext("memos/memo","addMemo");
36.
37.}
38./**
39.*printsdetailsofmemostostandardout.
40.*/
41.privatevoidprint()
42.{
43.System.out.println(_memos);
44.}
45./**
46.*mapsthexmldatatojavaobject
47.*/
48.privatevoidload(InputStreamin)throwsException
49.{
50.Digesterdgstr=newDigester();

  • init(dgstr);
52.try
53.{
54._memos=(Memos)dgstr.parse(in);
55.}catch(IOExceptione)
56.{
57.thrownewException("ErroroccuredWhenloadingdata",e);
58.}
59.}
60./*-----/MainMethod/------------------------------------------------------*/
61.publicstaticvoidmain(String[]args)throwsException
62.{
63.MemoAppmapp=newMemoApp();
64./*loadxmlfilefromclasspath*/
65.mapp.load(MemoApp.class.getResourceAsStream("/kitta/memo/memo.xml"));
66.mapp.print();
67.}
68.}
Digester"elem/elem/elem"的方式来匹配xml中的元素。这非常直观,实际上我们很早就开始使用类似的方式了。Digester将其称为PatternDigester中还有一个重要的概念就是Rule。我们在init方法中所做的就是将PatternRule关联起来。当Digester发现与我们所注册的Pattern匹配的xml元素时,就会调用我们注册时指定Rule来处理这个元素。
环境
以上代码的测试环境为WindowsXPJDK1.4.203Digester1.5Release
相关资源
Degister
官方资源
Website:http://jakarta.apache.org/commons/digester/index.html
CVSconnection:scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/digester/
CVSWebView:http://cvs.apache.org/viewcvs/jakarta-commons/digester/

一些其它地方的文章:
http://www-106.ibm.com/developerworks/java/library/j-lucene/
http://www.javaworld.com/javaworld/jw-10-2002/jw-1025-opensourceprofile.html
http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html

最后
好啦!就这么简单!因为这只是一些基本的应用,它可以帮助你了解Digester,毕竟这只是一个GettingStart吗!要更好的应用,就要更深入的研究。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-322904-1-1.html 上篇帖子: apache ftpClient 文件上传 下篇帖子: discuzz apache URL重定向
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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