首先我以一个实体类为例子
1.1新建一个实体类package com.pengliu.bean; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class User { private int id; private String userName; private String passWord; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
从上面的代码可以看出在实体类Class的上面标注了。@XmlRootElement
类标注表示:@XmlRootElement:用于定义该对象映射成xml根节点元素名,默认与类名一致。可通过@XmlRootElement(name="otherRootElement")方式指定具体名称。
@XmlAccessorType: 用于标识该java对象与xml映射的访问方式。有如下属性值。
PROPERTY: 所有set/get方法对将被映射为xml元素.除非被XmlTransient标注例外.
FIELD:所有对象属性将被映射为xml元素。除非被XmlTransient标注例外.
PUBLIC_MEMBER:每个public的get/set对方法或public field将被映射为xml元素。除非被XmlTransient标注例外.
NONE:没有fields 或 property被映射,除非显示指定具体fields或property。
属性标注表示:@XmlTransient:指对应属性不做xml映射。
@XmlTransient:指对应属性不做xml映射。
@XmlElement(name="product"):指定属性映射时对应xml元素名称
@XmlElementWrapper(name="products"):在某些场景下,需要对映射的属性做包装处理。如例子中products List对象属性,在xml中我想在映射对所有的product元素再做一个products 元素包装,如下所示,就可以按此种方式实现。<product> … </product>
2.然后我们再写一个XML的工具类
package com.pengliu.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.PropertyException; import javax.xml.bind.Unmarshaller; public class XmlUtil { /** * 此方法是Object对象转换String * @param originalObj(需要装换的对象) * @param xmlCharset(设置XML的编码,一般为utf-8) * @param isFragment(设置生成的时候是否显示【<?xml version="1.0" encoding="utf-8" standalone="yes"?>】,false显示,true不显示) * @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; } /** * 此方法是String装好成Object对象 * @param obj(传入需要装换后的对象) * @param xmlStr(传入XML的内容) * @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; } }
3.最后写一个测试类,来测试一下效果
package com.pengliu.test; import com.pengliu.bean.User; import com.pengliu.util.XmlUtil; public class TestXML { public static void main(String[] args) { User user=new User(); user.setId(1); user.setUserName("a540891049"); user.setPassWord("asd113399"); String xml=XmlUtil.convertJava2XmlStr(user, "utf-8", false); System.out.println(xml); User u=new User(); u=(User)XmlUtil.convertXmlStr2Java(u, xml); System.out.println(u.getUserName()); } }
最后控制台显示效果是:
<user> <id>1</id> <passWord>asd113399</passWord> <userName>a540891049</userName> </user> a540891049
转载于:https://my.oschina.net/xlyjx/blog/511197