eagle

          學無止境,細節決定成敗.
          posts - 12, comments - 11, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Jaxb筆記

          Posted on 2012-01-30 14:02 月下孤城 閱讀(3538) 評論(0)  編輯  收藏

          最近項目原因,研究了下jaxbjaxbJava api xml binding的簡稱,是為實現javaxml數據的相互轉換而定義的一個api標準。該標準以annotation的方式實現xml的轉換。不用開發人員單獨解析每個對象屬性與xml元素的mapping關系,只需在java bean中注入簡單的java annotation,其他的交給工具去處理。該工具包類能給xml數據處理帶來極大方便。具體實現見下。

          Java bean對象定義:

          /**
           * 促銷xml對象類 
           * 
          @author daiqiang
           * 對應xml文件內容如下:
           * <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
              <promotion>
                  <id>promotionId</id>
                  <name>元旦促銷</name>
                  <type>CMS</type>
                  <typeDes>CMS主推促銷</typeDes>
                  <startTime>2012-01-01</startTime>
                  <endTime>2012-01-03</endTime>
                  <products>
                      <product>
                          <merchantId>merchantid</merchantId>
                          <num>500</num>
                          <productCode>code1</productCode>
                          <productId>111</productId>
                          <requestId>codedata</requestId>
                      </product>
                      <product>
                          <merchantId>merchantid2</merchantId>
                          <num>800</num>
                          <productCode>code2</productCode>
                          <productId>2</productId>
                          <requestId>codedata</requestId>
                      </product>
                  </products>
              </promotion>
           *
           
          */

          @XmlRootElement(name
          ="promotion")
          @XmlAccessorType(XmlAccessType.FIELD)
          public class Promotion implements Serializable{

              
          private static final long serialVersionUID = 870036805093867083L;
              
              
          private String id;
              
          private String name;
              
          private String type;
              
          private String typeDes;
              
          private String startTime;
              
          private String endTime;
              
              @XmlElementWrapper(name
          ="products")
              @XmlElement(name
          ="product")
              
          private List<Product> products;
              
              
          /*@XmlTransient
              the field is not binded to xml
              private String testHiddenFields;
          */

              
          //此處省略具體set get 方法。

          說明:上文定義了一個促銷對象類Promotion.

          類標注表示:

          @XmlRootElement:用于定義該對象映射成xml根節點元素名,默認與類名一致。可通過@XmlRootElement(name="otherRootElement")方式指定具體名稱。

           

          @XmlAccessorType: 用于標識該java對象與xml映射的訪問方式。有如下屬性值。

          PROPERTY/FIELD/PUBLIC_MEMBER/NONE

           

          PROPERTY: 所有set/get方法對將被映射為xml元素.除非被XmlTransient標注例外.

           

          FIELD:所有對象屬性將被映射為xml元素。除非被XmlTransient標注例外.

           

          PUBLIC_MEMBER每個publicget/set對方法或public field將被映射為xml元素。除非被XmlTransient標注例外.

           

          NONE沒有fields property被映射,除非顯示指定具體fieldsproperty

           

           

          屬性標注表示:

          @XmlTransient:指對應屬性不做xml映射。

          @XmlElement(name="product"):指定屬性映射時對應xml元素名稱

          @XmlElementWrapper(name="products"):在某些場景下,需要對映射的屬性做包裝處理。如例子中products List對象屬性,在xml中我想在映射對所有的product元素再做一個products 元素包裝,如下所示,就可以按此種方式實現。

          <products>

              <product> … </product>

              <product> … </product>

              …

          </products>

           

          Javaxml映射方法

           

          Java對象到XML

           

          /**
               * convent java object to xml format String.
               * 
               * 
          @param originalObj
               * 
          @param xmlCharset
               *            the format of charset for xml. ie "UTF-8", "GBK"
               * 
          @param isFragment
               *            whether or not display the header for the generated xml. such
               *            as <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
               * 
          @return
               
          */

              
          public static String convertJava2XmlStr(Object originalObj,
                      String xmlCharset, 
          boolean isFragment) {
                  String xmlStr 
          = "";
                  
          try {
                      JAXBContext ctx 
          = JAXBContext.newInstance(originalObj.getClass());
                      Marshaller marshaller 
          = ctx.createMarshaller();
                      marshaller.setProperty(Marshaller.JAXB_ENCODING, xmlCharset);
                      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 
          true);
                      marshaller.setProperty(Marshaller.JAXB_FRAGMENT, isFragment);

                      ByteArrayOutputStream os 
          = new ByteArrayOutputStream();
                      marshaller.marshal(originalObj, os);

                      xmlStr 
          = os.toString();
                  }
           catch (PropertyException e) {
                      e.printStackTrace();
                  }
           catch (JAXBException e) {
                      e.printStackTrace();
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

                  
          return xmlStr;
              }

           

          XMLJava對象

           

          /**
               * convert xml string to Java object by JAXB.
               * 
          @param obj  to convert java object.
               * 
          @param xmlStr    
               * 
          @return
               
          */

              
          public static Object convertXmlStr2Java(Object obj, String xmlStr) {
                  
          try {
                      JAXBContext ctx 
          = JAXBContext.newInstance(obj.getClass());
                      InputStream source 
          = new ByteArrayInputStream(xmlStr.getBytes());
                      Unmarshaller unmarshaller 
          = ctx.createUnmarshaller();
                      obj 
          = unmarshaller.unmarshal(source);
                  }
           catch (JAXBException e) {
                      e.printStackTrace();
                  }

                  
          return obj;
              }






          ---------------------
          月下孤城
          mail:eagle_daiqiang@sina.com

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


          網站導航:
           
          主站蜘蛛池模板: 凌云县| 彰武县| 南通市| 安丘市| 博罗县| 玉门市| 盐池县| 通州市| 桓台县| 阿克苏市| 镇赉县| 北海市| 永仁县| 抚顺市| 义马市| 巴南区| 通海县| 海兴县| 新巴尔虎左旗| 梧州市| 黎城县| 页游| 乌鲁木齐市| 焉耆| 涞水县| 嘉善县| 乌兰察布市| 长海县| 株洲市| 托克托县| 鹿泉市| 嵩明县| 定南县| 北宁市| 金门县| 汶川县| 陈巴尔虎旗| 荆门市| 荔波县| 莫力| 磐安县|