zoukankan      html  css  js  c++  java
  • Jaxb笔记

    摘自: http://www.blogjava.net/eagle-daiq/archive/2012/01/30/369016.html

    最近项目原因,研究了下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;
        }





  • 相关阅读:
    商贸通帐套隐藏方法
    固定资产打开提示:上年度数据未结转!
    ZOJ 2432 Greatest Common Increasing Subsequence
    POJ 1080 Human Gene Functions
    POJ 1088 滑雪
    POJ 1141 Brackets Sequence
    POJ 1050 To the Max
    HDOJ 1029 Ignatius and the Princess IV
    POJ 2247 Humble Numbers
    HDOJ 1181 变形课
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3795085.html
Copyright © 2011-2022 走看看