`
lifaming15
  • 浏览: 59023 次
  • 来自: ...
文章分类
社区版块
存档分类

Apache jakarta commons Digester用法

 
阅读更多
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();
  1. 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吗!要更好的应用,就要更深入的研究。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics