逝者如斯夫

          靜而思之
          數據加載中……

          關于JavaBean和XML的轉換

          今天試了個XML和JavaBean轉換的軟件JOX,之前一直有這樣的需求,但比較來比較去還是這個比較簡單實用。我想除非我有WS的需求,否則象JIBX和APACHE 的WS工具對我來說都是重量級的。

          先看看輸出結果:

          ????????????
          ??
          <? xml?version="1.0"?encoding="ISO-8859-1" ?>
          ??
          < ApproxItem? java-class ="com.greatwall.csi.np.model.ApproxItem" >
          ??????
          < expose? java-class ="java.lang.Double" > 0.23 </ expose >
          ??????
          < list? java-class ="com.greatwall.csi.np.model.ApproxInfo" >
          ??????????
          < IDno > bbb </ IDno >
          ??????????
          < birth? java-class ="java.lang.Integer" > 222 </ birth >
          ??????
          </ list >
          ??????
          < map? java-class ="java.util.HashMap" >
          ??????????
          < dd? java-class ="com.greatwall.csi.np.model.ApproxInfo" >
          ??????????????
          < IDno > bbb </ IDno >
          ??????????????
          < birth? java-class ="java.lang.Integer" > 222 </ birth >
          ??????????
          </ dd >
          ??????????
          < ss? java-class ="com.greatwall.csi.np.model.ApproxInfo" >
          ??????????????
          < IDno > bbb </ IDno >
          ??????????????
          < birth? java-class ="java.lang.Integer" > 222 </ birth >
          ??????????
          </ ss >
          ??????
          </ map >
          ??????
          < month? java-class ="java.lang.Integer" > 3923 </ month >
          ??
          </ ApproxItem > ?

          在看看原來的JavaBean:

          ?? package ?com.greatwall.csi.np.model;

          ??
          import ?java.util.ArrayList;
          ??
          import ?java.util.HashMap;

          ??
          public ? class ?ApproxItem?{
          ??????
          public ? int ?getMonth()?{
          ??????????
          return ?month;
          ??????}

          ??????
          public ? void ?setMonth( int ?month)?{
          ??????????
          this .month? = ?month;
          ??????}

          ??????
          public ? double ?getExpose()?{
          ??????????
          return ?expose;
          ??????}

          ??????
          public ? void ?setExpose( double ?expose)?{
          ??????????
          this .expose? = ?expose;
          ??????}

          ??????
          public ?ArrayList?getList()?{
          ??????????
          return ?list;
          ??????}

          ??????
          public ?HashMap?getMap()?{

          ??????????
          return ?map;
          ??????}

          ??????
          public ? void ?setList(ArrayList?list)?{
          ??????????
          this .list? = ?list;
          ??????}

          ??????
          public ? void ?setMap(HashMap?map)?{
          ??????????
          this .map? = ?map;
          ??????}

          ??????
          private ? int ?month;
          ??????
          private ? double ?expose;
          ??????
          private ?ArrayList?list;
          ??????
          private ?HashMap?map;
          ??}

          處理結果是令人滿意的。實現過程如下:


          public ? class ?JOXUtils?{

          ????
          /**
          ?????*?Retrieves?a?bean?object?for?the
          ?????*?received?XML?and?matching?bean?class
          ?????
          */
          ????
          public ? static ?Object?fromXML(String?xml,?Class?className)?{
          ????????ByteArrayInputStream?xmlData?
          = ? new ?ByteArrayInputStream(xml.getBytes());
          ????????JOXBeanInputStream?joxIn?
          = ? new ?JOXBeanInputStream(xmlData);
          ????????
          try ?{
          ????????????
          return ?(Object)?joxIn.readObject(className);
          ????????}?
          catch ?(IOException?exc)?{
          ????????????exc.printStackTrace();
          ????????????
          return ? null ;
          ????????}
          ????????
          finally ?{
          ????????????
          try ?{
          ????????????????xmlData.close();
          ????????????????joxIn.close();
          ????????????}?
          catch ?(Exception?e)?{
          ????????????????e.printStackTrace();
          ????????????}
          ????????}
          ????}

          ????
          /**
          ?????*?Returns?an?XML?document?String?for?the?received?bean
          ?????
          */
          ????
          public ? static ?String?toXML(Object?bean)?{
          ????????ByteArrayOutputStream?xmlData?
          = ? new ?ByteArrayOutputStream();
          ????????JOXBeanOutputStream?joxOut?
          = ? new ?JOXBeanOutputStream(xmlData);
          ????????
          try ?{
          ????????????joxOut.writeObject(beanName(bean),?bean);
          ????????????
          return ?xmlData.toString();
          ????????}?
          catch ?(IOException?exc)?{
          ????????????exc.printStackTrace();
          ????????????
          return ? null ;
          ????????}
          ????????
          finally ?{
          ????????????
          try ?{
          ????????????????xmlData.close();
          ????????????????joxOut.close();
          ????????????}?
          catch ?(Exception?e)?{
          ????????????????e.printStackTrace();
          ????????????}
          ????????}
          ????}

          ????
          /**
          ?????*?Find?out?the?bean?class?name
          ?????
          */
          ????
          private ? static ?String?beanName(Object?bean)?{
          ????????String?fullClassName?
          = ?bean.getClass().getName();
          ????????String?classNameTemp?
          = ?fullClassName.substring(
          ????????????fullClassName.lastIndexOf(
          " . " )? + ? 1 ,
          ????????????fullClassName.length()
          ????????????);
          ????????
          return ?classNameTemp.substring( 0 ,? 1 )
          ????????????
          + ?classNameTemp.substring( 1 );
          ????}
          ????
          ????
          public ? static ? void ?main(String[]?args)?{
          ????????ApproxItem?approxItem?
          = ? new ?ApproxItem();
          ????????approxItem.setMonth(
          3923 );
          ????????approxItem.setExpose(
          0.23 );
          ????????approxItem.setMap(
          new ?HashMap());
          ????????ApproxInfo?approxInfo?
          = ? new ?ApproxInfo();
          ????????approxInfo.setBirth(
          111 );
          ????????approxInfo.setIDno(
          " aaa " );
          ????????approxItem.getMap().put(
          " ss " ,?approxInfo);
          ????????approxInfo.setBirth(
          222 );
          ????????approxInfo.setIDno(
          " bbb " );
          ????????approxItem.getMap().put(
          " dd " ,?approxInfo);
          ????????approxItem.setList(
          new ?ArrayList( 1 ));
          ????????approxItem.getList().add(approxInfo);
          ????????System.out.println(
          " JOXUtils.toXML(approxItem)= " );
          ???????System.out.println(JOXUtils.toXML(approxItem));
          ????}

          Wutka Consulting還提供了一個比較有趣的工具,Java2DTD,自從使用JDO做持久層框架,我就一直想找一個這樣的工具,因為JDO的映射文件并沒有將全部的JavaBean類描述到.jdo文件,所以在編程環境下一直無法獲取所有的實體類和字段的一個描述情況。廢話少說,馬上試一下。運行時需要3個包文件:beantodtd,需要轉換的實體classes,dtdparser。

          java?-cp?beantodtd-1.0;classes;d:/policy38/lib/dtdparser121.jar; BeanToDTD \n
          ?-
          mixed?com.greatwall.csi.bs.model.PersonBase

          -mixed參數是指定按JavaBean中的變量名生成屬性,還有些其它的參數,可以控制大小寫和連字符號等。另外由于我用的實體是JDO增強過的class文件,所以classpath還需要加上JDO實現的包。


          運行的結果有少少無奈,因為對于JavaBean中List這樣的容器字段類型,無法讓它識別出對象的類型,只能生成類似<!ELEMENT pension ANY>這樣的描述,如果在一個什么配置文件中可以設置的話那就更好了。

          另外還有一個DTD解析工具,可以解析DTD文件,目前還不知道有什么其它用途,使用如下方法可以解析后輸出控制臺:

          java?-classpath?d:/policy38/lib/dtdparser121.jar?com.wutka.dtd.Tokenize?code.dtd

          資源:

          http://www.wutka.com/download.html

          posted on 2007-03-23 19:02 ideame 閱讀(6552) 評論(3)  編輯  收藏 所屬分類: Java

          評論

          # re: 關于JavaBean和XML的轉換[未登錄]  回復  更多評論   

          我用jaxb綁定xml,然后dozer拷貝數據生成xml
          試試你這個看能不能滿足我的項目需求
          2007-03-24 00:49 | tornado

          # re: 關于JavaBean和XML的轉換  回復  更多評論   

          @tornado
          試了一下,dozer 最新版本不支持 jdk 1.4 的嗎?
          2007-04-20 17:07 | ideame

          # re: 關于JavaBean和XML的轉換  回復  更多評論   

          hi,你好,我也在搞這個,覺的這個比較方便,可就是碰到LIST 就比較麻煩,網上找來找去沒這樣的例子,幾天在你這里看到了,謝謝!可我還有問題,比如
          我的XML文件是
          <?xml version="1.0" encoding="gb2312" ?>
          <MarkTest>
          <list java-class="java.util.ArrayList">
          <l1 java-class="com.wolftel.cxGprs.test.JoxBean">
          <name>sg</name>
          <age>13</age>
          </l1>
          </list>
          <address>杭州</address>
          </MarkTest>
          我的類是這樣的
          public class TestXML {
          private String address;
          private ArrayList list;

          public String getAddress() {
          return address;
          }

          public void setAddress(String address) {
          this.address = address;
          }

          public ArrayList getList() {
          return list;
          }

          public void setList(ArrayList list) {
          this.list = list;
          }

          }

          public class JoxBean {
          private int age;
          private String name;

          public int getAge() {
          return age;
          }

          public void setAge(int age) {
          this.age = age;
          }

          public String getName() {
          return name;
          }

          public void setName(String name) {
          this.name = name;
          }
          }

          運行類
          public class JoxUtil {
          public static void main(String[] args) throws IOException {
          JOXBeanInputStream joxIn = new JOXBeanInputStream(JoxUtil.class.getResourceAsStream("test2.xml"));
          TestXML t = (TestXML)joxIn.readObject(TestXML.class);
          ArrayList list = t.getList();
          for (Object aList : list) {
          JoxBean b = (JoxBean) aList;
          System.out.println(b.getAge() + "___" + b.getName());
          }
          System.out.println(t.getAddress());

          }
          }
          然后無法得到那個LIST啊,如何解決?

          2007-08-13 17:00 | SG
          主站蜘蛛池模板: 新田县| 确山县| 中牟县| 阳山县| 汉寿县| 库尔勒市| 无锡市| 乃东县| 元朗区| 四子王旗| 卓尼县| 蕲春县| 沙坪坝区| 宜丰县| 永安市| 杭锦后旗| 来安县| 芮城县| 波密县| 名山县| 于都县| 贺兰县| 沙田区| 建瓯市| 板桥市| 将乐县| 志丹县| 桐乡市| 横山县| 阿城市| 新宁县| 巴彦淖尔市| 准格尔旗| 壤塘县| 阿瓦提县| 浙江省| 威海市| 德江县| 铜梁县| 犍为县| 四会市|