【XML】使用javax.xml.bind包实现bean-xml互转

举报
轻狂书生FS 发表于 2020/12/02 23:05:52 2020/12/02
【摘要】 第一步:说明:    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,...

第一步:说明:

   JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
 

第二步:相关的重要Class、Interface和Annotation

    A、JDK中JAXB相关的重要Class和Interface

  1. JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
  2. Marshaller接口,将Java对象序列化为XML数据。
  3. Unmarshaller接口,将XML数据反序列化为Java对象。

   B、 JDK中JAXB相关的重要注解(Annotation)

  1.   @XmlRootElement:根节点,将Java类或枚举类型映射到XML元素。
  2.   @XmlAttribute:该属性作为xml的attribute,将Java类的一个属性映射到与属性同名的一个XML元素。
  3.   @XmlElement:该属性作为xml的element,且可以增加属性(name="NewElementName"),那么生成的xml串的elment的标签是NewElementName
  4. @XmlAccessorType(XmlAccessType.PROPERTY):意思是 只有属性(有get和set方法才是属性,没有get和set方法的不是属性)才能被转换成 xml 中的标签。@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。
  5. @XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
  6. @XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
  7. @XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
  8. @XmlType注解标注xml生成顺序,默认情况下,Jaxb编组出来的xml中的字段顺序是随机的,你可以使用@XmlType的propOrder属性来指定序列化的顺序。

注:

1.对于@XmlElementWrapper标注的属性,不能出现在@XmlType的propOrder列表中。

2.对于所有@XmlElement标注过的属性,必须出现在@XmlType的propOrder列表中。

第三步:使用demo

目录结构:

定义一个User类:


  
  1. package xmlUtil;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. import java.util.List;
  5. import javax.xml.bind.annotation.*;
  6. /**
  7. * @Author: 轻狂书生FS
  8. * @Description:
  9. * @CreateDate: 2019/3/29 10:04
  10. * @Version: 1.0
  11. */
  12. @XmlAccessorType(XmlAccessType.FIELD)
  13. // XML文件中的根标识
  14. @XmlRootElement(name = "User")
  15. public class User implements Serializable {
  16. private static final long serialVersionUID = 1L;
  17. @XmlAttribute(name = "xmnl")
  18. private final String xmnl="www.baidu.com";
  19. // 用户Id
  20. @XmlElement(name = "UserId")
  21. private int userId;
  22. // 用户名
  23. @XmlElement(name = "UserName")
  24. private String userName;
  25. // 用户密码
  26. @XmlElement(name = "Password")
  27. private String password;
  28. // 用户生日
  29. @XmlElement(name = "Birthday")
  30. private Date birthday;
  31. // 用户钱包
  32. @XmlElement(name = "Money")
  33. private double money;
  34. //用户地址
  35. @XmlElementWrapper(name = "AddressList")
  36. @XmlElement(name = "Address")
  37. private List<Address> addressList;
  38. //用户电脑
  39. @XmlElement(name = "Computers")
  40. private List<Computer> computers;
  41. public List<Computer> getComputers() {
  42. return computers;
  43. }
  44. public void setComputers(List<Computer> computers) {
  45. this.computers = computers;
  46. }
  47. public List<Address> getAddressList() {
  48. return addressList;
  49. }
  50. public void setAddressList(List<Address> addressList) {
  51. this.addressList = addressList;
  52. }
  53. public User() {
  54. super();
  55. }
  56. public User(int userId, String userName, String password, Date birthday,
  57. double money) {
  58. super();
  59. this.userId = userId;
  60. this.userName = userName;
  61. this.password = password;
  62. this.birthday = birthday;
  63. this.money = money;
  64. }
  65. public int getUserId() {
  66. return userId;
  67. }
  68. public void setUserId(int userId) {
  69. this.userId = userId;
  70. }
  71. public String getUserName() {
  72. return userName;
  73. }
  74. public void setUserName(String userName) {
  75. this.userName = userName;
  76. }
  77. public String getPassword() {
  78. return password;
  79. }
  80. public void setPassword(String password) {
  81. this.password = password;
  82. }
  83. public Date getBirthday() {
  84. return birthday;
  85. }
  86. public void setBirthday(Date birthday) {
  87. this.birthday = birthday;
  88. }
  89. public double getMoney() {
  90. return money;
  91. }
  92. public void setMoney(double money) {
  93. this.money = money;
  94. }
  95. @Override
  96. public String toString() {
  97. return "User{" +
  98. "xmnl='" + xmnl + '\'' +
  99. ", userId=" + userId +
  100. ", userName='" + userName + '\'' +
  101. ", password='" + password + '\'' +
  102. ", birthday=" + birthday +
  103. ", money=" + money +
  104. ", addressList=" + addressList +
  105. ", computers=" + computers +
  106. '}';
  107. }
  108. }

定义一个Address类


  
  1. package xmlUtil;
  2. import javax.xml.bind.annotation.XmlType;
  3. import java.io.Serializable;
  4. /**
  5. * @Author: 轻狂书生FS
  6. * @Description:
  7. * @CreateDate: 2019/3/29 10:29
  8. * @Version: 1.0
  9. */
  10. // 控制JAXB 绑定类中属性和字段的排序
  11. @XmlType(propOrder = {
  12. "city",
  13. "province",
  14. })
  15. public class Address implements Serializable {
  16. private String province;
  17. private String city;
  18. public String getProvince() {
  19. return province;
  20. }
  21. public void setProvince(String province) {
  22. this.province = province;
  23. }
  24. public String getCity() {
  25. return city;
  26. }
  27. public void setCity(String city) {
  28. this.city = city;
  29. }
  30. public Address(String province, String city) {
  31. this.province = province;
  32. this.city = city;
  33. }
  34. public Address() {
  35. }
  36. }

定义一个Computer类


  
  1. package xmlUtil;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. import javax.xml.bind.annotation.XmlAccessType;
  5. import javax.xml.bind.annotation.XmlAccessorType;
  6. import javax.xml.bind.annotation.XmlRootElement;
  7. import javax.xml.bind.annotation.XmlType;
  8. /**
  9. * @Author: 轻狂书生FS
  10. * @Description:
  11. * @CreateDate: 2019/3/29 10:44
  12. * @Version: 1.0
  13. */
  14. @XmlAccessorType(XmlAccessType.FIELD)
  15. @XmlRootElement(name = "Computer")
  16. @XmlType(propOrder = { "brandName", "price" })
  17. public class Computer implements Serializable {
  18. private static final long serialVersionUID = 1L;
  19. // 品牌名
  20. private String brandName;
  21. // 价格
  22. private double price;
  23. public Computer() {
  24. super();
  25. }
  26. public Computer( String brandName,double price) {
  27. super();
  28. this.brandName = brandName;
  29. this.price = price;
  30. }
  31. public String getBrandName() {
  32. return brandName;
  33. }
  34. public void setBrandName(String brandName) {
  35. this.brandName = brandName;
  36. }
  37. public double getPrice() {
  38. return price;
  39. }
  40. public void setPrice(double price) {
  41. this.price = price;
  42. }
  43. @Override
  44. public String toString() {
  45. return "Computer{" +
  46. "brandName='" + brandName + '\'' +
  47. ", price=" + price +
  48. '}';
  49. }
  50. }

 

此时给出最重要的进行Java对象和XML文件相互操作的核心代码XMLUtil.java,其中有着两种方式进行转换,一种是转换成对象和string类型的xml转换,一种是对象和xml文件进行转换。


  
  1. package xmlUtil;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.StringReader;
  7. import java.io.StringWriter;
  8. import javax.xml.bind.JAXBContext;
  9. import javax.xml.bind.JAXBException;
  10. import javax.xml.bind.Marshaller;
  11. import javax.xml.bind.Unmarshaller;
  12. /**
  13. * 封装了XML转换成object,object转换成XML的代码
  14. *
  15. * @author Steven
  16. *
  17. */
  18. public class XMLUtil {
  19. /**
  20. * 将对象直接转换成String类型的 XML输出
  21. *
  22. * @param obj
  23. * @return
  24. */
  25. public static String convertToXml(Object obj) {
  26. // 创建输出流
  27. StringWriter sw = new StringWriter();
  28. try {
  29. // 利用jdk中自带的转换类实现
  30. JAXBContext context = JAXBContext.newInstance(obj.getClass());
  31. Marshaller marshaller = context.createMarshaller();
  32. // 格式化xml输出的格式
  33. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
  34. Boolean.TRUE);
  35. // 将对象转换成输出流形式的xml
  36. marshaller.marshal(obj, sw);
  37. } catch (JAXBException e) {
  38. e.printStackTrace();
  39. }
  40. return sw.toString();
  41. }
  42. /**
  43. * 将对象根据路径转换成xml文件
  44. *
  45. * @param obj
  46. * @param path
  47. * @return
  48. */
  49. public static void convertToXml(Object obj, String path) {
  50. try {
  51. // 利用jdk中自带的转换类实现
  52. JAXBContext context = JAXBContext.newInstance(obj.getClass());
  53. Marshaller marshaller = context.createMarshaller();
  54. // 格式化xml输出的格式
  55. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
  56. Boolean.TRUE);
  57. // 将对象转换成输出流形式的xml
  58. // 创建输出流
  59. FileWriter fw = null;
  60. try {
  61. fw = new FileWriter(path);
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. }
  65. marshaller.marshal(obj, fw);
  66. } catch (JAXBException e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. @SuppressWarnings("unchecked")
  71. /**
  72. * 将String类型的xml转换成对象
  73. */
  74. public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
  75. Object xmlObject = null;
  76. try {
  77. JAXBContext context = JAXBContext.newInstance(clazz);
  78. // 进行将Xml转成对象的核心接口
  79. Unmarshaller unmarshaller = context.createUnmarshaller();
  80. StringReader sr = new StringReader(xmlStr);
  81. xmlObject = unmarshaller.unmarshal(sr);
  82. } catch (JAXBException e) {
  83. e.printStackTrace();
  84. }
  85. return xmlObject;
  86. }
  87. @SuppressWarnings("unchecked")
  88. /**
  89. * 将file类型的xml转换成对象
  90. */
  91. public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
  92. Object xmlObject = null;
  93. try {
  94. JAXBContext context = JAXBContext.newInstance(clazz);
  95. Unmarshaller unmarshaller = context.createUnmarshaller();
  96. FileReader fr = null;
  97. try {
  98. fr = new FileReader(xmlPath);
  99. } catch (FileNotFoundException e) {
  100. e.printStackTrace();
  101. }
  102. xmlObject = unmarshaller.unmarshal(fr);
  103. } catch (JAXBException e) {
  104. e.printStackTrace();
  105. }
  106. return xmlObject;
  107. }
  108. }

 测试类:


  
  1. package xmlUtil;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. /**
  6. * @Author: 轻狂书生FS
  7. * @Description:
  8. * @CreateDate: 2019/3/29 10:31
  9. * @Version: 1.0
  10. */
  11. public class Test {
  12. public static void main(String[] args) {
  13. // 创建需要转换的对象
  14. User user = new User(1, "Steven", "@sun123", new Date(), 1000.0);
  15. List<Address> addressList = new ArrayList<>();
  16. Address address1 = new Address("山东省","菏泽市");
  17. Address address2 = new Address("上海市","浦东新区");
  18. Address address3 = new Address("浙江省","杭州");
  19. addressList.add(address1);
  20. addressList.add(address2);
  21. addressList.add(address3);
  22. user.setAddressList(addressList);
  23. System.out.println("---将对象转换成string类型的xml Start---");
  24. // 将对象转换成string类型的xml
  25. String str = XMLUtil.convertToXml(user);
  26. // 输出
  27. System.out.println(str);
  28. System.out.println("---将对象转换成string类型的xml End---");
  29. System.out.println();
  30. }
  31. }

运行结果:

请仔细体会,xml和注解之间的关系。

本文参考:https://blog.csdn.net/songdeitao/article/details/17304395 

文章来源: blog.csdn.net,作者:轻狂书生FS,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/LookForDream_/article/details/88884316

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200