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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bestcxx/article/details/80574759

在之前的一篇文章中,我们使用常规方法实现看 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;


@XmlRootElement(name="student")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyStudent {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "MyStudent [name=" + name + ", age=" + age + "]";
	}
}

  • 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 {
	
	@XmlElement(name="list自定义")
	private List<MyStudent> list;
	
	public List<MyStudent> getList() {
		return list;
	}

	public void setList(List<MyStudent> list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "MyList [list=" + list + "]";
	}
}

  • 班级类
package com.bestcxx.stu.bean;



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(name="date")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass {
	private String className;
	
	@XmlElement(name="mylist自定义")
	private MyList mylist;
	
	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}

	
	public MyList getMylist() {
		return mylist;
	}

	public void setMylist(MyList mylist) {
		this.mylist = mylist;
	}

	@Override
	public String toString() {
		return "MyClass [className=" + className + ", mylist=" + mylist + "]";
	}

}

测试方法
package com.bestcxx.stu.util;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBException;

import org.junit.Test;

import com.bestcxx.stu.bean.MyClass;
import com.bestcxx.stu.bean.MyList;
import com.bestcxx.stu.bean.MyStudent;

public class XmlBeanUtilTest {
	
	//提供参数组织的方法
	public MyClass getMyClass(){
		MyClass m1=new MyClass();
		m1.setClassName("一班");
		
		MyStudent m21=new MyStudent();
		m21.setAge(20);
		m21.setName("jecket");
		
		MyStudent m22=new MyStudent();
		m22.setAge(21);
		m22.setName("jecket2");
		
		List<MyStudent> list=new ArrayList<MyStudent>();
		
		list.add(m21);
		list.add(m22);
		
		MyList ml=new MyList();
		ml.setList(list);
		
		m1.setMylist(ml);
		return m1;
	}
	
	//Java Bean 转 XML
	@Test
	public void testBeanToXmlEncoding(){
		//为了清晰表述,我们把参数组织单独列为一个方法
		MyClass m1=getMyClass();
		String xml="";
		try {
			xml=XmlBeanUtil.BeanToXmlEncoding(m1, "GBK");
		} catch (JAXBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Java Bean 转 XML="+xml);
		
	}
	
	//XML 转 Java Bean
	@Test
	public void testXmlToBeanEncoding(){
		//为了清晰表述,我们把参数组织单独列为一个方法
		MyClass m1=null;
		String xml="<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"yes\"?>"
				+ "<date>"
				+ "<className>一班</className>"
				+ " <mylist自定义>"
				+ "<list自定义>"
				+ "<name>jecket</name>"
				+ "<age>20</age>"
				+ "</list自定义>"
				+ "<list自定义>"
				+ " <name>jecket2</name>"
				+ "<age>21</age>"
				+ " </list自定义>"
				+ "</mylist自定义>"
				+ "</date>";
		
		
				try {
					m1=XmlBeanUtil.XmlToBeanEncoding(xml, MyClass.class,"GBK");
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (JAXBException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
		
		System.out.println("XML 转 Java Bean ="+m1.toString());
		
	}

}

测试结果
Java Bean 转 XML=<?xml version="1.0" encoding="GBK" standalone="yes"?>
<date>
    <className>一班</className>
    <mylist自定义>
        <list自定义>
            <name>jecket</name>
            <age>20</age>
        </list自定义>
        <list自定义>
            <name>jecket2</name>
            <age>21</age>
        </list自定义>
    </mylist自定义>
</date>
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

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

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

<Items>
    <Item>
         <CustomerNumber>123</CustomerNumber>
     </Item>
     <Item>
         <CustomerNumber>456</CustomerNumber>
     </Item>
 </Items>
番外:为节点增加子属性 @XmlAttribute

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

<list default_self_name="default_self_value">
	```
<list>

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


@XmlAttribute(name = "default_self_name")
    private String id="default_self_value";

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
展开阅读全文

没有更多推荐了,返回首页