JAXB常用注解讲解(超详细)
作者:互联网
简介:
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
一个简单的例子:
Person.class类
package io.renren.modules.temptest; import lombok.Data; import javax.xml.bind.annotation.XmlRootElement; /** * @author xubo * @ClassNme Person * @Description TODO * @Date 2022-03-30 17:03:29 * @version1.0 */ @Data @XmlRootElement //关于这个注解稍后会有解释 public class Person { private int id; private String name; private String gender; private String addr; private String area; public Person() { } public Person( String name, String gender, String addr, String area) {//这里没有id this.name = name; this.gender = gender; this.addr = addr; this.area = area; } }
JAXBTest.class类:
package io.renren.modules.temptest; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.File; /** * @author xubo * @ClassNme JAXBTest * @Description TODO * @Date 2022-03-30 17:08:26 * @version1.0 */ public class JAXBTest { //对象转xml public void generateXML() { Person person = new Person("abc", "男", "北京", "朝阳区"); File file = new File("D:\\person.xml"); JAXBContext jc = null; try { //根据Person类生成上下文对象 jc = JAXBContext.newInstance(Person.class); //从上下文中获取Marshaller对象,用作将bean编组(转换)为xml Marshaller ma = jc.createMarshaller(); //以下是为生成xml做的一些配置 //格式化输出,即按标签自动换行,否则就是一行输出 ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //设置编码(默认编码就是utf-8) ma.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //是否省略xml头信息,默认不省略(false) ma.setProperty(Marshaller.JAXB_FRAGMENT, false); //编组 ma.marshal(person, file); } catch (JAXBException e) { e.printStackTrace(); } } //xml转对象 public void generateBean() { File file = new File("D:\\person.xml"); JAXBContext jc = null; try { jc = JAXBContext.newInstance(Person.class); Unmarshaller uma = jc.createUnmarshaller(); Person person = (Person) uma.unmarshal(file); System.out.println(person); } catch (JAXBException e) { e.printStackTrace(); } } }
Test.class类:
package io.renren.modules.temptest; /** * @author xubo * @ClassNme Test * @Description TODO * @Date 2022-03-30 17:52:48 * @version1.0 */ public class Test { public static void main(String[] args){ JAXBTest jaxbTest = new JAXBTest(); //对象转xml jaxbTest.generateXML(); //xml转对象 jaxbTest.generateBean(); } }
测试结果:
运行方法:generateXML():
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <person> <addr>北京</addr> <area>朝阳区</area> <gender>男</gender> <id>0</id> <name>abc</name> </person>
此xml相当于该xsd文件:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="addr" minOccurs="0"/> <xs:element type="xs:string" name="area" minOccurs="0"/> <xs:element type="xs:string" name="gender" minOccurs="0"/> <xs:element type="xs:int" name="id" minOccurs="0"/> <xs:element type="xs:string" name="name" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
运行方法:generateBean():
是不是很方便?这只是一个最简单的小例子,下文会在这个例子的基础上介绍和讲解其他的一些常用JAXB注解。因为会使用到部分xsd的知识,不了解的读者可以看我另一篇博客:《xsd学习:超详细解析》,否则下文会有些理解困难。
注:从jdk1.7开始,JAXB就对解组和编组的方法进行了更简单的封装,所以实际项目中除非自己要进行个性化设置,否则大可不用自己再创建JAXBContext实例,直接通过JAXB静态调用相应的工具方法就行了,于是上面的测试方法可以写的更简练些:
下面为了测试方便,还是在JAXBTest类中写了两个静态方法,运行后结果还是一样的。代码看起来更加简洁,这只是简单的功能。
package io.renren.modules.temptest; import javax.xml.bind.JAXB; import java.io.File; /** * @author xubo * @ClassNme Test * @Description TODO * @Date 2022-03-30 17:52:48 * @version1.0 */ public class Test { public static void main(String[] args){ // JAXBTest jaxbTest = new JAXBTest(); // //对象转xml // jaxbTest.generateXML(); // // //xml转对象 // jaxbTest.generateBean(); generateXML1(); generateBean1(); } //为了测试方便使用静态 public static void generateXML1() { Person person = new Person("abc", "男", "北京", "朝阳区"); File file = new File("D:\\person1.xml"); JAXB.marshal(person, file); } public static void generateBean1() { File file = new File("D:\\person1.xml"); Person person = JAXB.unmarshal(file, Person.class); System.out.println(person); } }
结果显示:上面修改了生成文件名名字person1.xml
运行generateXML1()方法
运行generateBean1()方法
直接使用默认的配置,已经足够应付大多数情况,读者可以试一下。
常用注解:
@XmlRootElement:
作用和用法:
类级别的注解,将类映射为xml全局元素,也就是根元素。就像spring配置文件中的beans。上面的例子中我将该注解用在了person类上,生成了<person>根元素。常与@XmlType,@XmlAccessorType,@XmlAccessorOrder连用。
属性:
该注解含有name和namespace两个属性。namespace属性用于指定生成的元素所属的命名空间。name属性用于指定生成元素的名字,若不指定则默认使用类名小写作为元素名。修改上面的例子,在该注解上使用name,namespace属性:
package io.renren.modules.temptest; import lombok.Data; import javax.xml.bind.annotation.XmlRootElement; /** * @author xubo * @ClassNme Person * @Description TODO * @Date 2022-03-30 17:03:29 * @version1.0 */ @Data @XmlRootElement(name = "xubo" , namespace = "www.baidu.com") public class Person { private int id; private String name; private String gender; private String addr; private String area; public Person() { } public Person( String name, String gender, String addr, String area) {//这里没有id this.name = name; this.gender = gender; this.addr = addr; this.area = area; } }
重新运行方法generateXML1(),可以看到根元素变名字了,注意根元素跟之前不一样了,多了ns2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:xubo xmlns:ns2="www.baidu.com">
<addr>北京市</addr>
<area>朝阳区潘家园</area>
<gender>男</gender>
<id>0</id>
<name>abccc</name>
</ns2:xubo>
generateBean1
标签:xml,String,JAXB,Person,讲解,注解,public,name 来源: https://www.cnblogs.com/javaxubo/p/16078514.html