运用泛型实现复杂对象与 XML 的互转

你的名字 2022-05-23 07:44 345阅读 0赞

文章目录

            • 上一篇文章
            • 介绍一下 JAXB-看红字即可
            • 基本的注解含义
            • 泛型方法工具类
            • 测试需要三个实体
            • 测试方法
            • 测试结果
            • 番外:根据类的类型生成节点名字 @XmlElements
            • 番外:额外生成环绕节点 @XmlElementWrapper(name = “Items”)
            • 番外:为节点增加子属性 @XmlAttribute

在之前的一篇文章中,我们使用常规方法实现看 Java Bena 与 XML 之间的相互转化,本文将使用泛型,两文对比可以看出泛型的优势——代码复用。

上一篇文章

XML报文转JAVA对象-JAVA对象转XML报文

介绍一下 JAXB-看红字即可

JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类。***JAXB允许JAVA人员将JAVA类映射为XML表示方式***,常用的注解包括:@XmlRootElement,@XmlElement等等。
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,***JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档***。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。(选自百度百科 https://baike.baidu.com/item/JAXB/479341?fr=aladdin)

基本的注解含义

https://blog.csdn.net/bestcxx/article/details/79203756
定位到@XmlRootElement(name=”date”)

泛型方法工具类

泛型(四)-泛型应用之XML和实体类型的转化

测试需要三个实体

我们需要三个实体,一个是班级,一个是学生,还有一个中间节点。一个班级有多个学生这样,如果你的 XML 报文比较复杂,只需要为每一个节点创建一个实体,实体关系满足 XML 节点的关系即可完成复杂 XML 与 Java Bean 的相互转化。本文测试的 XML 结构为 < Myclass>< List>< MyStudent>

  • 学生类

    package com.bestcxx.stu.bean;

    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;

  1. @XmlRootElement(name="student")
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. public class MyStudent {
  4. private String name;
  5. private int age;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public int getAge() {
  13. return age;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. @Override
  19. public String toString() {
  20. return "MyStudent [name=" + name + ", age=" + age + "]";
  21. }
  22. }
  • List 节点类

    package com.bestcxx.stu.bean;

    import java.util.List;

    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class MyList {

    1. @XmlElement(name="list自定义")
    2. private List<MyStudent> list;
    3. public List<MyStudent> getList() {
    4. return list;
    5. }
    6. public void setList(List<MyStudent> list) {
    7. this.list = list;
    8. }
    9. @Override
    10. public String toString() {
    11. return "MyList [list=" + list + "]";
    12. }

    }

  • 班级类

    package com.bestcxx.stu.bean;

  1. import javax.xml.bind.annotation.XmlAccessType;
  2. import javax.xml.bind.annotation.XmlAccessorType;
  3. import javax.xml.bind.annotation.XmlElement;
  4. import javax.xml.bind.annotation.XmlRootElement;
  5. @XmlRootElement(name="date")
  6. @XmlAccessorType(XmlAccessType.FIELD)
  7. public class MyClass {
  8. private String className;
  9. @XmlElement(name="mylist自定义")
  10. private MyList mylist;
  11. public String getClassName() {
  12. return className;
  13. }
  14. public void setClassName(String className) {
  15. this.className = className;
  16. }
  17. public MyList getMylist() {
  18. return mylist;
  19. }
  20. public void setMylist(MyList mylist) {
  21. this.mylist = mylist;
  22. }
  23. @Override
  24. public String toString() {
  25. return "MyClass [className=" + className + ", mylist=" + mylist + "]";
  26. }
  27. }
测试方法
  1. package com.bestcxx.stu.util;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.xml.bind.JAXBException;
  6. import org.junit.Test;
  7. import com.bestcxx.stu.bean.MyClass;
  8. import com.bestcxx.stu.bean.MyList;
  9. import com.bestcxx.stu.bean.MyStudent;
  10. public class XmlBeanUtilTest {
  11. //提供参数组织的方法
  12. public MyClass getMyClass(){
  13. MyClass m1=new MyClass();
  14. m1.setClassName("一班");
  15. MyStudent m21=new MyStudent();
  16. m21.setAge(20);
  17. m21.setName("jecket");
  18. MyStudent m22=new MyStudent();
  19. m22.setAge(21);
  20. m22.setName("jecket2");
  21. List<MyStudent> list=new ArrayList<MyStudent>();
  22. list.add(m21);
  23. list.add(m22);
  24. MyList ml=new MyList();
  25. ml.setList(list);
  26. m1.setMylist(ml);
  27. return m1;
  28. }
  29. //Java Bean 转 XML
  30. @Test
  31. public void testBeanToXmlEncoding(){
  32. //为了清晰表述,我们把参数组织单独列为一个方法
  33. MyClass m1=getMyClass();
  34. String xml="";
  35. try {
  36. xml=XmlBeanUtil.BeanToXmlEncoding(m1, "GBK");
  37. } catch (JAXBException e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41. System.out.println("Java Bean 转 XML="+xml);
  42. }
  43. //XML 转 Java Bean
  44. @Test
  45. public void testXmlToBeanEncoding(){
  46. //为了清晰表述,我们把参数组织单独列为一个方法
  47. MyClass m1=null;
  48. String xml="<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"yes\"?>"
  49. + "<date>"
  50. + "<className>一班</className>"
  51. + " <mylist自定义>"
  52. + "<list自定义>"
  53. + "<name>jecket</name>"
  54. + "<age>20</age>"
  55. + "</list自定义>"
  56. + "<list自定义>"
  57. + " <name>jecket2</name>"
  58. + "<age>21</age>"
  59. + " </list自定义>"
  60. + "</mylist自定义>"
  61. + "</date>";
  62. try {
  63. m1=XmlBeanUtil.XmlToBeanEncoding(xml, MyClass.class,"GBK");
  64. } catch (UnsupportedEncodingException e) {
  65. // TODO Auto-generated catch block
  66. e.printStackTrace();
  67. } catch (JAXBException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. System.out.println("XML 转 Java Bean ="+m1.toString());
  72. }
  73. }
测试结果
  1. Java Bean XML=<?xml version="1.0" encoding="GBK" standalone="yes"?>
  2. <date>
  3. <className>一班</className>
  4. <mylist自定义>
  5. <list自定义>
  6. <name>jecket</name>
  7. <age>20</age>
  8. </list自定义>
  9. <list自定义>
  10. <name>jecket2</name>
  11. <age>21</age>
  12. </list自定义>
  13. </mylist自定义>
  14. </date>
  15. XML Java Bean =MyClass [className=一班, mylist=MyList [list=[MyStudent [name=jecket, age=20], MyStudent [name=jecket2,age=21]]]]
番外:根据类的类型生成节点名字 @XmlElements

https://blog.csdn.net/bestcxx/article/details/79203756#XmlElements_194

  1. @XmlElements(value = { @XmlElement(name="item",type=InsureBillSessionBodyItemDTO.class)})
番外:额外生成环绕节点 @XmlElementWrapper(name = “Items”)

类似这种,查看 https://blog.csdn.net/bestcxx/article/details/79203756#XmlElementWrappername__Items_199

  1. <Items>
  2. <Item>
  3. <CustomerNumber>123</CustomerNumber>
  4. </Item>
  5. <Item>
  6. <CustomerNumber>456</CustomerNumber>
  7. </Item>
  8. </Items>
番外:为节点增加子属性 @XmlAttribute

有时候我们需要生成的节点内容的格式如下:

  1. <list default_self_name="default_self_value">
  2. ```
  3. <list>

那么这个default_self_name=“default_self_value” 是如何添加的呢?
这个需要借助于 @XmlAttribute 标签,具体来说,需要一个前提和一个设置
前提:这个节点必须是一个实体类,如果只是一个简单属性,那你就需要改造代码类
设置:就是在这个实体类中增加一段代码,指定一下子属性名称和值,说白了就是增加一个属性值,名字自定义,使用 @XmlAttribute 标注,提供get/set 方法

  1. @XmlAttribute(name = "default_self_name")
  2. private String id="default_self_value";
  3. public String getId() {
  4. return id;
  5. }
  6. public void setId(String id) {
  7. this.id = id;
  8. }

发表评论

表情:
评论列表 (有 0 条评论,345人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 中Xml对象

    在java开发中我们经常会遇到Xml与对象互相转换的情况,尤其是针对WebService访问时会涉及到xml与对象的转换问题。目前可以用于xml与对象互转的方式有很多这里采用j