<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    逝者如斯夫

    靜而思之
    數(shù)據(jù)加載中……

    關于JavaBean和XML的轉(zhuǎn)換

    今天試了個XML和JavaBean轉(zhuǎn)換的軟件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;
    ??}

    處理結果是令人滿意的。實現(xiàn)過程如下:


    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文件,所以在編程環(huán)境下一直無法獲取所有的實體類和字段的一個描述情況。廢話少說,馬上試一下。運行時需要3個包文件:beantodtd,需要轉(zhuǎn)換的實體classes,dtdparser。

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

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


    運行的結果有少少無奈,因為對于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 閱讀(6542) 評論(3)  編輯  收藏 所屬分類: Java

    評論

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

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

    # re: 關于JavaBean和XML的轉(zhuǎn)換  回復  更多評論   

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

    # re: 關于JavaBean和XML的轉(zhuǎn)換  回復  更多評論   

    hi,你好,我也在搞這個,覺的這個比較方便,可就是碰到LIST 就比較麻煩,網(wǎng)上找來找去沒這樣的例子,幾天在你這里看到了,謝謝!可我還有問題,比如
    我的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
    主站蜘蛛池模板: 91精品成人免费国产| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 日韩免费电影网站| 亚洲国产一区视频| 一级a性色生活片久久无少妇一级婬片免费放 | 永久免费观看黄网站| 亚洲日韩国产精品乱| 国产精品玖玖美女张开腿让男人桶爽免费看 | 日韩精品亚洲专区在线观看| 国产成人亚洲毛片| 国产精品无码素人福利免费| 色偷偷噜噜噜亚洲男人| 国产精品免费综合一区视频| 免费无码国产V片在线观看| 亚洲精品和日本精品| 成av免费大片黄在线观看| 亚洲av日韩av不卡在线观看| 无人在线观看免费高清| 亚洲一级在线观看| 国语成本人片免费av无码| 自拍偷自拍亚洲精品播放| 亚洲精品乱码久久久久久不卡| 99久久免费国产特黄| 久久亚洲AV成人无码国产| 免费A级毛片无码无遮挡内射| 亚洲日韩国产AV无码无码精品| 亚洲国产精品无码久久久久久曰 | 免费毛片a线观看| 亚洲国产精品久久网午夜 | 国产亚洲成人在线播放va| 久久久国产精品无码免费专区| 久久精品国产亚洲AV蜜臀色欲| 国产精品国产午夜免费福利看| 叮咚影视在线观看免费完整版| 亚洲人成综合在线播放| 亚洲AV网站在线观看| 24小时日本韩国高清免费| 亚洲AV色欲色欲WWW| 亚洲AV无码乱码在线观看裸奔| 成年私人影院免费视频网站| jizz在线免费观看|