javabean 和 xml 互轉


1.場景描述

  將javabean對象轉換為xml字符串,將xml字符串轉換為javabean對象。

2.maven依賴

<dependency>
      <groupId>jdom</groupId>
      <artifactId>jdom</artifactId>
      <version>1.0</version>
</dependency>
<dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.7.0</version>
</dependency>

3.注解說明 

  @XmlRootElement 將類或枚舉類型映射到 XML 元素。
  @XmlElement 將 JavaBean 屬性映射到派生於屬性名稱的 XML 元素。
  @XmlTransient 阻止將 JavaBean 屬性映射到 XML 表示形式。
  @XmlTransient 注釋對於解決 JavaBean 屬性名稱與字段名稱之間的名稱沖突,或者用於防止字段/屬性的映射。當取消首字母大寫的 JavaBean 屬性名稱與字段名稱相同時,就可能發生名稱沖突。如果 JavaBean 屬性引用該字段,那么可以通過防止映射使用 @XmlTransient 注釋的字段或 JavaBean 屬性來解決名稱沖突。

4.代碼編寫

工具類

import org.apache.commons.beanutils.BeanUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * xml與bean互轉工具類
 */
public class JaXmlBeanUtil {

    /**
     * 將javaBean轉換為xml對象
     * @param clazz
     * @param bean
     * @return
     */
    public static String parseBeanToXml(Class clazz,Object bean){
        StringWriter sw = null;
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            sw = new StringWriter();
            //該值默認為false,true則不會創建即頭信息,即<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
            jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            jaxbMarshaller.marshal(bean, sw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return sw.toString();
    }

    /**
     *將xml對象轉換為javaBean
     * @param clazz
     * @param xml
     * @return
     */
    public static Object parseXmlToBean(Class clazz,String xml){
        if(xml!=null&&xml!=""){
            Field[] fields = clazz.getDeclaredFields();
            List<Field> fieldList = new ArrayList<Field>();
            for (Field fie : fields) {
                if (fie.isAnnotationPresent(XmlElementAnno.class)) {
                    fieldList.add(fie);
                }
            }
            try {
                StringReader read = new StringReader(xml);
                InputSource source = new InputSource(read);
                //創建一個新的SAXBuilder
                SAXBuilder sb = new SAXBuilder();
                Document doc = sb.build(source);
                //取的根元素
                Element root = doc.getRootElement();
                Object object = clazz.newInstance();
                if(!fieldList.isEmpty()){
                    for (Field field : fieldList) {
                        Element child = root.getChild(field.getName());
                        if(child!=null){
                            BeanUtils.setProperty(object, field.getName(), child.getValue());
                        }
                    }
                }
                return object;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

javabean對象

import com.bestpay.ecurrency.utils.XmlElementAnno;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;


@XmlRootElement(name="root")
public class JaBeanToXml {

    @XmlElement(name="xmlname")
    @XmlElementAnno
    private String name;

    @XmlElement(name="xmladdress")
    @XmlElementAnno
    private String address;

    @XmlElement(name="xmlage")
    @XmlElementAnno
    private int age;

    @XmlTransient
    public String getName() {
        return name;
    }

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

    @XmlTransient
    public String getAddress() {
        return address;
    }

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

    @XmlTransient
    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "JaBeanToXml{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", age=" + age +
                '}';
    }
}

自定義注解,用於指定那類屬性進行轉換

import java.lang.annotation.*;

@Documented  
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.FIELD)
public @interface XmlElementAnno {

}

測試類

import com.bestpay.ecurrency.pojo.JaBeanToXml;
import com.bestpay.ecurrency.utils.JaXmlBeanUtil;
import org.junit.Test;

public class JaBeanToXmlTest {
    /**
     * xml轉javaBean
     */
    @Test
    public void parseXmlToJaBean() {
        //組裝xml
        StringBuilder sb = new StringBuilder();
        sb.append("<root>");
        sb.append("<name>wangkecheng</name>");
        sb.append("<address>上海</address>");
        sb.append("<age>27</age>");
        sb.append("</root>");

        JaBeanToXml jaBeanToXml = (JaBeanToXml) JaXmlBeanUtil.parseXmlToBean(JaBeanToXml.class,sb.toString());
        System.out.println(jaBeanToXml.toString());
    }

    /**
     * bean轉xml
     */
    @Test
    public void parseJaBeanToXml(){

        JaBeanToXml jaBeanToXml = new JaBeanToXml();
        jaBeanToXml.setName("wangkecheng");
        jaBeanToXml.setAddress("上海");
        jaBeanToXml.setAge(28);

        String xml = JaXmlBeanUtil.parseBeanToXml(JaBeanToXml.class,jaBeanToXml);
        System.out.println(xml);
    }
}

測試結果

測試1:
JaBeanToXml{name='wangkecheng', address='上海', age=27}
測試2:
<root><xmlname>wangkecheng</xmlname><xmladdress>上海</xmladdress><xmlage>28</xmlage></root>

 源碼倉庫地址:https://github.com/nn-kc/utils.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM