每日一得

          不求多得,只求一得 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 閱讀(20880) 評論(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
            回復  更多評論
            

          主站蜘蛛池模板: 雅安市| 普兰县| 阆中市| 通道| 高唐县| 呼和浩特市| 同德县| 松阳县| 华宁县| 庆安县| 广东省| 昭觉县| 西乌珠穆沁旗| 阿勒泰市| 灵川县| 宜阳县| 湘潭市| 连城县| 尤溪县| 镇赉县| 安庆市| 元氏县| 四子王旗| 周至县| 天柱县| 宿州市| 大安市| 克东县| 吴忠市| 团风县| 永定县| 柳林县| 凤凰县| 耿马| 星子县| 茶陵县| 佛冈县| 贵定县| 乌恰县| 平山县| 镶黄旗|