相关注解

参考: https://blog.csdn.net/songdeitao/article/details/17304395
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,顶层XML元素。
@XmlElement,XML元素。
@XmlAttribute,XML属性。

转换工具类

  1. package com.example.demo.xml;
  2. import java.io.StringReader;
  3. import java.io.StringWriter;
  4. import javax.xml.bind.JAXBContext;
  5. import javax.xml.bind.JAXBException;
  6. import javax.xml.bind.Marshaller;
  7. import javax.xml.bind.Unmarshaller;
  8. public class ObjAndXmlUtil {
  9. /**
  10. * @param xmlStr 字符串
  11. * @param c 对象Class类型
  12. * @return 对象实例
  13. */
  14. @SuppressWarnings("unchecked")
  15. public static <T> T xml2Object(String xmlStr, Class<T> c) {
  16. try {
  17. JAXBContext context = JAXBContext.newInstance(c);
  18. Unmarshaller unmarshaller = context.createUnmarshaller();
  19. T t = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
  20. return t;
  21. } catch (JAXBException e) {
  22. e.printStackTrace();
  23. return null;
  24. }
  25. }
  26. /**
  27. * @param object 对象
  28. * @return 返回xmlStr
  29. */
  30. public static String object2Xml(Object object) {
  31. try {
  32. StringWriter writer = new StringWriter();
  33. JAXBContext context = JAXBContext.newInstance(object.getClass());
  34. Marshaller marshal = context.createMarshaller();
  35. // 格式化输出
  36. marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  37. // 编码格式,默认为utf-8
  38. marshal.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  39. // 是否省略xml头信息
  40. marshal.setProperty(Marshaller.JAXB_FRAGMENT, false);
  41. marshal.setProperty("jaxb.encoding", "utf-8");
  42. marshal.marshal(object, writer);
  43. return new String(writer.getBuffer());
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. return null;
  47. }
  48. }
  49. }

DEMO

java实体类

  1. package com.example.demo.xml;
  2. import javax.xml.bind.annotation.XmlAttribute;
  3. import javax.xml.bind.annotation.XmlElement;
  4. import javax.xml.bind.annotation.XmlRootElement;
  5. @XmlRootElement(name = "RootElement")
  6. public class Java2XmlDemo {
  7. @XmlAttribute(name = "rootAttribute1")
  8. public String rootAttribute1;
  9. @XmlAttribute(name = "lang")
  10. public String lang;
  11. @XmlElement(name = "Head")
  12. public String head;
  13. @XmlElement(name = "Body")
  14. public Element element;
  15. @XmlRootElement(name = "Element")
  16. public static class Element {
  17. @XmlElement(name = "ElementDetail")
  18. public ElementDetail elementDetail;
  19. }
  20. @XmlRootElement(name = "ElementDetail")
  21. public static class ElementDetail {
  22. @XmlAttribute(name = "detailAttribute")
  23. public String detailAttribute;
  24. }
  25. }

测试

  1. @Test
  2. public void testJava2Xml() {
  3. Java2XmlDemo demo = new Java2XmlDemo();
  4. demo.rootAttribute1 = "Root";
  5. demo.lang = "zh-CN";
  6. demo.head = "测试head";
  7. Element element = new Element();
  8. ElementDetail detail = new ElementDetail();
  9. detail.detailAttribute = "测试明细属性";
  10. element.elementDetail = detail;
  11. demo.element = element;
  12. String xml = ObjAndXmlUtil.object2Xml(demo);
  13. System.out.println(xml);

结果

  1. <?xml version="1.0" encoding="utf-8" standalone="yes"?>
  2. <RootElement rootAttribute1="Root" lang="zh-CN">
  3. <Head>测试head</Head>
  4. <Body>
  5. <ElementDetail detailAttribute="测试明细属性"/>
  6. </Body>
  7. </RootElement>