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
