接上篇继续梳理JAXB标签的使用
JDK中JAXB相关的重要Annotation:
@XmlRootElement,将Java类或枚举类型映射到XML元素。(生成的xml根节点,默认是class名)
- 可以用name指定@XmlRootElement(name="QueryResquest")
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
- required 属性来指定该元素是否必须出现,required为true时,表示@XMLElement注解下的变量为必传变量;required为false时,表示该变量为非必传变量。
- name属性,可以为生成的xml节点起别名
//证件号 @XmlElement(name="SFID",required =true) int id; //姓名 @XmlElement(name="NAME",required =true) String name; //性别 @XmlElement(name="sex",required =true) boolean sex; //年龄 @XmlElement(name="age",required =false) int age; 运行结果: <person> <NAME>刘阿姨</NAME> <SFID>0</SFID> <age>29</age> <sex>false</sex> </person>
@XmlType,将Java类或枚举类型映射到XML模式类型(可以指定xml各个字段的顺序)常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:
name
属性在你不想使用class名的时候,来指定XML Schema中的名字。namespace
属性用来指定目标namespace的名字。propOrder
的值是一个字符串数组,用来设置子elements的顺序
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
@XmlType(name="PersonRequest",propOrder = {
"name",
"id",
"age",
"sex"
})
public class Person{
//证件号
@XmlElement(name="id",required =true)
int id;
//姓名
@XmlElement(name="name",required =true)
String name;
//性别
@XmlElement(name="sex",required =true)
boolean sex;
//年龄
@XmlElement(name="age",required =true)
int age;
转换结果:
<Person>
<name>刘阿姨</name>
<id>0</id>
<age>29</age>
<sex>false</sex>
</Person>
我用的jdk1.8 xmltype的name属性没有生效
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。(放在class上边和@XmlRootElement)
- 用于对java对象生成的xml元素进行排序。它有两个属性值
- AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序
- XmlAccessOrder.UNDEFINED:不排序
@XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement() @XmlType(name="PersonRequest",propOrder = { "name", "id", "age", "sex", "name" }) @XmlAccessorOrder() public class Person{。。。。 运行结果: <person age="0"> <SFID>1</SFID> <NAME>aaaa</NAME> <sex>false</sex> </person>
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。@XmlElementWrapper(name="CardNos") @XmlElement(name="Card") String[] cardno; 运行结果: <person age="0"> <SFID>1</SFID> <NAME>aaaa</NAME> <sex>false</sex> <CardNos> <Card>11111</Card> <Card>22222</Card> <Card>33333</Card> </CardNos> </person>
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
//证件号
@XmlElement(name="SFID",required =true)
int id;
//姓名
@XmlElement(name="NAME",required =true)
String name;
//性别
@XmlElement(name="sex",required =true)
boolean sex;
//年龄
@XmlAttribute
int age;
运行结果:
<person age="0">
<NAME>aaaa</NAME>
<SFID>1</SFID>
<sex>false</sex>
</person>
测试完最后的javabean如下:
package com.bean;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement()
@XmlType(name="PersonRequest",propOrder = {
"name",
"id",
"age",
"sex",
"name"
})
@XmlAccessorOrder()
public class Person{
//证件号
@XmlElement(name="SFID",required =true)
int id;
//姓名
@XmlElement(name="NAME",required =true)
String name;
//性别
@XmlElement(name="sex",required =true)
boolean sex;
//年龄
@XmlAttribute
int age;
//卡号集
@XmlElementWrapper(name="CardNos")
@XmlElement(name="Card")
String[] cardno;
public String[] getCardno() {
return cardno;
}
public void setCardno(String[] cardno) {
this.cardno = cardno;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(int id, String name, boolean sex, int age) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
参考:https://www.cnblogs.com/qiyebao/p/4573665.html