每日一得

不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發
最近關心的內容:SSH,seam,flex,敏捷,TDD
本站的官方站點是:顛覆軟件

  BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks
key words: Digester? 解析xml

假設有下列xml文件:
<?xml?version='1.0'?encoding='utf-8'?>
<address-book>
????
<contact?myType="individual">
????????
<name>Zane?Pasolini</name>
????????
<address>999?W.?Prince?St.</address>
????????
<city>New?York</city>
????????
<province>NY</province>
????????
<postalcode>10013</postalcode>
????????
<country>USA</country>
????????
<telephone>1-212-345-6789</telephone>
????
</contact>
????
<contact?myType="business">
????????
<name>SAMOFIX?d.o.o.</name>
????????
<address>Ilica?47-2</address>
????????
<city>Zagreb</city>
????????
<province></province>
????????
<postalcode>10000</postalcode>
????????
<country?from="cn">Croatia</country>
????????
<telephone>385-1-123-4567</telephone>
????
</contact>
</address-book>

這是一份常用到的文件,現在我們需要將之映射到java bean,用Digester解析顯得非常簡單
public?class?AddressBookParser
{
????
/**
?????*?Prints?the?contact?information?to?standard?output.
?????*
?????*?
@param?contact?the?<code>Contact</code>?to?print?out
?????
*/
????
public?void?addContact(Contact?contact)
????{
????????System.out.println(
"TYPE:?"?+?contact.getType());
????????System.out.println(
"NAME:?"?+?contact.getName());
????????System.out.println(
"????ADDRESS:????"?+?contact.getAddress());
????????System.out.println(
"????CITY:???????"?+?contact.getCity());
????????System.out.println(
"????PROVINCE:???"?+?contact.getProvince());
????????System.out.println(
"????POSTALCODE:?"?+?contact.getPostalcode());
????????System.out.println(
"????COUNTRY:????"?+?contact.getCountry());
????????System.out.println(
"????COUNTRY-From:????"?+?contact.getCountryFrom());
????????System.out.println(
"????TELEPHONE:??"?+?contact.getTelephone());
????}

????
/**
?????*?Configures?Digester?rules?and?actions,?parses?the?XML?file?specified
?????*?as?the?first?argument.
?????*
?????*?
@param?args?command?line?arguments
?????
*/
????
public?static?void?main(String[]?args)?throws?IOException,?SAXException
????{
????????
//?instantiate?Digester?and?disable?XML?validation
????????Digester?digester?=?new?Digester();
????????digester.setValidating(
false);

????????
//?instantiate?AddressBookParser?class
????????digester.addObjectCreate("address-book",?AddressBookParser.class?);
????????
//?instantiate?Contact?class
????????digester.addObjectCreate("address-book/contact",?Contact.class?);

????????
//?set?type?property?of?Contact?instance?when?'type'?attribute?is?found
????????
//對有屬性的值通過setProperties方法

????????digester.addSetProperties(
"address-book/contact",?????????"myType",?"type"?);

????????
//?set?different?properties?of?Contact?instance?using?specified?methods
????????
//addCallMethod與addBeanPropertySetter等價
????????
//?參數?0代表一個參數,默認就是當前讀的數據

????????digester.addCallMethod(
"address-book/contact/name",???????"setName",?0);
????????digester.addCallMethod(
"address-book/contact/address",????"setAddress",?0);
????????digester.addCallMethod(
"address-book/contact/address",????"setAddress",0);
????????digester.addCallMethod(
"address-book/contact/city",???????"setCity",?0);
????????digester.addCallMethod(
"address-book/contact/province",???"setProvince",?0);
????????digester.addCallMethod(
"address-book/contact/postalcode",?"setPostalcode",?0);
????????digester.addCallMethod(
"address-book/contact/country",????"setCountry",?0);



????????
//增加country的屬性?:?from
????????digester.addSetProperties("address-book/contact/country","from","countryFrom");
????????digester.addCallMethod(
"address-book/contact/telephone",??"setTelephone",?0);

????????
//?call?'addContact'?method?when?the?next?'address-book/contact'?pattern?is?seen
????????digester.addSetNext("address-book/contact",???????????????"addContact"?);

????????
//?now?that?rules?and?actions?are?configured,?start?the?parsing?process
????????AddressBookParser?abp?=?(AddressBookParser)?digester.parse(new?File("c:\\addressbook.xml"));
????}

????
/**
?????*?JavaBean?class?that?holds?properties?of?each?Contact?entry.
?????*?It?is?important?that?this?class?be?public?and?static,?in?order?for
?????*?Digester?to?be?able?to?instantiate?it.
?????
*/
????
public?static?class?Contact
????{
????????
private?String?type;
????????
private?String?name;
????????
private?String?address;
????????
private?String?city;
????????
private?String?province;
????????
private?String?postalcode;
????????
private?String?country;
??????? //增加一個country的屬性:?from
????????private?String?countryFrom;
????????private?String?telephone;

????????
public?void?setType(String?newType)
????????{
????????????type?
=?newType;
????????}
????????
public?String?getType()
????????{
????????????
return?type;
????????}

????????
public?void?setName(String?newName)
????????{
????????????name?
=?newName;
????????}
????????
public?String?getName()
????????{
????????????
return?name;
????????}

????????
public?void?setAddress(String?newAddress)
????????{
????????????address?
=?newAddress;
????????}
????????
public?String?getAddress()
????????{
????????????
return?address;
????????}

????????
public?void?setCity(String?newCity)
????????{
????????????city?
=?newCity;
????????}
????????
public?String?getCity()
????????{
????????????
return?city;
????????}

????????
public?void?setProvince(String?newProvince)
????????{
????????????province?
=?newProvince;
????????}
????????
public?String?getProvince()
????????{
????????????
return?province;
????????}

????????
public?void?setPostalcode(String?newPostalcode)
????????{
????????????postalcode?
=?newPostalcode;
????????}
????????
public?String?getPostalcode()
????????{
????????????
return?postalcode;
????????}

????????
public?void?setCountry(String?newCountry)
????????{
????????????country?
=?newCountry;
????????}
????????
public?String?getCountry()
????????{
????????????
return?country;
????????}

????????
public?void?setTelephone(String?newTelephone)
????????{
????????????telephone?
=?newTelephone;
????????}
????????
public?String?getTelephone()
????????{
????????????
return?telephone;
????????}

????????
public?String?getCountryFrom()?{
????????????
return?countryFrom;
????????}

????????
public?void?setCountryFrom(String?countryFrom)?{
????????????
this.countryFrom?=?countryFrom;
????????}
????}
}


AjaxChat 中的讀取房間信息的方式顯得更簡潔
房間的xml配置文件如下:
<rooms>
??
<room?id="1"?name="General?Topics"?/>
??
<room?id="2"?name="Programming"?/>
??
<room?id="3"?name="Movies"?/>
??
<room?id="4"?name="Music"?/>
??
<room?id="5"?name="Television"?/>
</rooms>

解析代碼如下 :
public?synchronized?void?init(InputStream?isConfigFile)?{

????????log.debug(
"init()");
????????
if?(isConfigFile?!=?null)?{
????????????
//?Read?in?rooms?config?and?create?beans,?hand?off?to?DAO.
????????????Digester?digester?=?new?Digester();
????????????digester.setValidating(
false);
????????????digester.push(
this);
????????????digester.addObjectCreate(
"rooms/room",
????????????????????
"org.apache.struts.apps.ajaxchat.dto.RoomDTO");
??? ?? ?? ? //注意這里,如果xl的屬性名稱和bean的屬性名稱完全對應,則直接提供xml的位置即可
????????????digester.addSetProperties(
"rooms/room");
????????????digester.addSetNext(
"rooms/room",?"addRoom");
????????????
try?{
????????????????digester.parse(isConfigFile);
????????????????log.info(
"*****?Rooms?=?"?+?rooms);
????????????}?
catch?(IOException?ioe)?{
????????????????ioe.printStackTrace();
????????????}?
catch?(SAXException?se)?{
????????????????se.printStackTrace();
????????????}
????????}

????}?
//?End?init().

如果在xml文件中增加非attribute則更改后的配置文件如下:

<rooms>
??
<room?id="1"?name="General?Topics"?/>
??
<room?id="2"?name="Programming"?/>
??
<room?id="3"?name="Movies"?/>
??
<room?id="4"?name="Music"?/>
??
<room?id="5"?name="Television"?/>
??
<room>
????
<id>6</id>
????
<name>shit</name>
??
</room>
??
<room>
????
<id>7</id>
????
<name>haha</name>
??
</room>
</rooms>
對應的解析如下:
public?synchronized?void?init(InputStream?isConfigFile)?{

????????log.debug(
"init()");
????????
if?(isConfigFile?!=?null)?{
????????????
//?Read?in?rooms?config?and?create?beans,?hand?off?to?DAO.
????????????Digester?digester?=?new?Digester();
????????????digester.setValidating(
false);
????????????digester.push(
this);
????????????digester.addObjectCreate(
"rooms/room",
????????????????????
"org.apache.struts.apps.ajaxchat.dto.RoomDTO");
????????????digester.addSetProperties(
"rooms/room");
??? ?? ?? ? //增加addCallMethod方法
????????????digester.addCallMethod(
"rooms/room/id","setId",0);
????????????digester.addCallMethod(
"rooms/room/name","setName",0);
????????????digester.addSetNext(
"rooms/room",?"addRoom");
????????????
try?{
????????????????digester.parse(isConfigFile);
????????????????log.info(
"*****?Rooms?=?"?+?rooms);
????????????}?
catch?(IOException?ioe)?{
????????????????ioe.printStackTrace();
????????????}?
catch?(SAXException?se)?{
????????????????se.printStackTrace();
????????????}
????????}

????}?
//?End?init().

posted on 2006-09-06 23:32 Alex 閱讀(20496) 評論(19)  編輯  收藏 所屬分類: java

評論

# re: 用Digester解析xml到bean 2006-09-07 16:01 山風小子
寫的很好:-)  回復  更多評論
  

# re: 用Digester解析xml到bean 2006-09-08 22:10 巴哈姆特
不錯,,值得參考!  回復  更多評論
  

# re: 用Digester解析xml到bean 2006-10-19 17:33 villagehead
不錯。

另外,這兩句:
digester.addCallMethod("rooms/room/id","setId",0);
digester.addCallMethod("rooms/room/name","setName",0);

還可以用
digester.addBeanPropertySetter("rooms/room/id");
digester.addBeanPropertySetter("rooms/room/name");

的形式

另外的另外,回字有4種寫法。;)  回復  更多評論
  

# re: 用Digester解析xml到bean 2007-01-26 18:00 zhyiwww
看過,有收獲。  回復  更多評論
  

# re: 用Digester解析xml到bean 2007-02-12 09:19 qq
不錯,非常不錯!  回復  更多評論
  

# re: 用Digester解析xml到bean 2007-02-12 10:05 qq
我自己實踐了一下,覺得效果非常不錯!省去了DOM操作的細節,但是缺點是操作文檔不靈活。需要寫很多代碼。  回復  更多評論
  

# re: 用Digester解析xml到bean 2007-10-25 12:54 wdd
為什么按你一模一樣的敲上!并且是運行是報此錯呢?
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.commons.digester.Digester.<init>(Digester.java:299)
at AddressBookParser.main(AddressBookParser.java:34)  回復  更多評論
  

# re: 用Digester解析xml到bean 2008-01-24 09:05 JAVA 小白
<persistence-unit name="aa">
<class>a1</class>
<class>a2</class>
<class>a3</class>
</persistence-unit>

<class>標簽怎么實現

請指教。  回復  更多評論
  

# re: 用Digester解析xml到bean 2008-05-11 17:42 學海無涯
為什么javabean必須是靜態的類?
請高手指點,謝謝了  回復  更多評論
  

# re: 用Digester解析xml到bean 2008-07-24 14:07 aga
javabean不必一定是靜態類
to ../../../*
你沒有加包
commons-digester\commons-logging\commons-beanutil似乎還有一個
  回復  更多評論
  

# re: 用Digester解析xml到bean[未登錄] 2008-08-30 23:46 54powerman
手動寫bean,夠麻煩  回復  更多評論
  

# re: 用Digester解析xml到bean 2009-06-01 16:18 sheng
如果層次太深 還是讓人很傷心的 它有沒有提供 //province 這中形式呢

它是xpath的檢索方式嗎??

剛學習 多指教

謝謝  回復  更多評論
  

# re: 用Digester解析xml到bean 2009-07-02 16:45 ×××××
@wdd
少包沒導入  回復  更多評論
  

# re: 用Digester解析xml到bean 2009-11-24 09:39 路過
當屬性為int時,怎么調用addCallMethod方法?  回復  更多評論
  

# re: 用Digester解析xml到bean 2010-10-23 21:11 GANK
寫的不錯,值得學習!!  回復  更多評論
  

# re: 用Digester解析xml到bean 2014-04-16 14:03 ferrari
包導錯了
這個目錄下的import org.apache.commons.digester.Digester;  回復  更多評論
  

# re: 用Digester解析xml到bean 2014-07-01 14:17 fsgs
gdsfssdgdsg  回復  更多評論
  

# re: 用Digester解析xml到bean 2014-07-01 14:17 fsgs
不是太會
@  回復  更多評論
  

# re: 用Digester解析xml到bean[未登錄] 2014-08-07 17:16 lee
哪四種@villagehead
  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。


網站導航:
 
2013火热网络捕鱼游戏 牛牛视频的网站是什么 重庆福彩欢乐生肖开奖 女主穿越重生赚钱的 多乐彩票登陆 电子游艺娱乐送彩金 7李逵劈鱼 qq分分彩 广东快乐十分开奖直播视频网 手机真钱捕鱼平台 湖南快乐十分走势图表一定牛 内蒙古时时彩昨天开奖号码 北京11选5开奖结果查询 平码平肖论坛 同城游美女捕鱼游戏 qq群北京赛车机器人 彩票控pk10冠军走势图