(javax)javaBean转xml

来源:互联网 发布:nba2k16捏脸中国人数据 编辑:程序博客网 时间:2024/06/05 19:12

一般与第三方公司进行交互时,经常会用到xml报文,生成xml的方式有多种,以前用map转xml,后来发现,在实际工作中,会有很多局限性。

后来改用javaBean转xml,觉得还挺方便的,下面上一下案例代码:

场景一:

该场景是生成(非多层级)xml

javaBean类:

package test.javabeantoxml;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "xml")
@XmlType(propOrder = { "amount"})
public class MOUNT {
    @XmlElement
    private String amount;

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }
    
}

期望结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
    <amount>1</amount>
</xml>


实现代码:

public class TEST {
    public static void main(String[] args) {

              MOUNT mount = new MOUNT();
             mount.setAmount("1");
             String xmlstr = convertToXml(mount,"UTF-8");

             System.out.println(xmlstr);

    }

    /**
     * xml转换成JavaBean
     * @param xml
     * @param c
     * @return
     */  
     @SuppressWarnings("unchecked")  
     public static <T> T converyToJavaBean(String xml, Class<T> c) {  
           T t = null;  
            try {  
                JAXBContext context = JAXBContext.newInstance(c);  
                Unmarshaller unmarshaller = context.createUnmarshaller();  
                t = (T) unmarshaller.unmarshal(new StringReader(xml));  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
      
            return t;  
        }


}

运行后就得到想要的结果咯。。。。

不过往往在工作中,没有那么简单地需求,很多时候,是需要生成包含list的xml报文。那该怎么办呢?


场景二:

生成多层级(list类型)xml

javabean一:

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "xml")
@XmlType(propOrder = { "amount","addrList"})
public class MOUNT {
    @XmlElement
    private String amount;

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }
    
    @XmlElementWrapper(name="addrs")//指定父节点
    @XmlElement(name = "addr")
    private List<ADDR> addrList;

    public List<ADDR> getAddrList() {
        return addrList;
    }

    public void setAddrList(List<ADDR> addrList) {
        this.addrList = addrList;
    }
    
}

javabean二:

import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder = { "prov","contry"})
public class ADDR{
    @BeanPropertyCheck(require = true, zh = "省份")
    private String prov;
    @BeanPropertyCheck(require = true, zh = "市")
    private String contry;
    public String getProv() {
        return prov;
    }
    public void setProv(String prov) {
        this.prov = prov;
    }
    public String getContry() {
        return contry;
    }
    public void setContry(String contry) {
        this.contry = contry;
    }
    
    @Override
    public String toString(){
         return "{prov=" + prov + ",contry=" + contry +"}";  
    }
}

期望结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
    <amount>1</amount>
    <addrs>
        <addr>
            <prov>江苏</prov>
            <contry>南京</contry>
        </addr>
        <addr>
            <prov>江苏</prov>
            <contry>淮安</contry>
        </addr>
    </addrs>
</xml>


实现案例:

public class TEST {
    public static void main(String[] args) {

        MOUNT mount = new MOUNT();
        mount.setAmount("1");
        List<ADDR> addrList = new ArrayList<ADDR>();
        ADDR addr = new ADDR();
        addr.setProv("江苏");
        addr.setContry("南京");
        addrList.add(addr);
        
        ADDR addr2 = new ADDR();
        addr2.setProv("江苏");
        addr2.setContry("淮安");
        addrList.add(addr2);
        mount.setAddrList(addrList);
        
        String xmlstr = convertToXml(mount,"UTF-8");
        System.out.println(xmlstr);

   }

    /**
     * JavaBean转换成xml
     * @param obj
     * @param encoding  
     * @return  
     */  
    public static String convertToXml(Object obj, String encoding) {  
        String result = null;  
        try {  
            JAXBContext context = JAXBContext.newInstance(obj.getClass());  
            Marshaller marshaller = context.createMarshaller();  
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
            StringWriter writer = new StringWriter();  
            marshaller.marshal(obj, writer);  
            result = writer.toString();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
            return result;  
        }

}


原创粉丝点击