JAXB实现xml和javaBean的相互转换
xml2javaBean
1.基础demo
使用@XmlRootElement:将类映射为xml全局元素,也就是根元素。
使用@XmlElement: 注解对应的字段映射成本类对应XML的元素,子元素。
1.javaBean
package com.JAXB;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person {
@XmlElement(name="id")
private String id;
@XmlElement(name="name")
private String name;
@XmlElement(name="gender")
private String gender;
@XmlElement(name="addr")
private String addr;
}
2.Test
public class DemoTest {
public static <T> void generateXML(File file, Class<T> beanClazz,Object o) {
try {
//根据Person类生成上下文对象
JAXBContext jc = JAXBContext.newInstance(beanClazz);
//从上下文中获取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(o, file);
} catch (JAXBException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Person person = new Person("abc", "男", "北京", "朝阳区");
File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
generateXML(file,Person.class,person);
}
}
测试结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person>
<id>abc</id>
<name>男</name>
<gender>北京</gender>
<addr>朝阳区</addr>
</Person>
2.带属性xml转换
使用@XmlAttribute:注解对应的字段映射成本类对应XML元素的属性。
1.javaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person {
@XmlAttribute(name="id")
private String id;
@XmlElement(name="name")
private String name;
@XmlElement(name="gender")
private String gender;
@XmlElement(name="addr")
private String addr;
}
测试结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
<name>男</name>
<gender>北京</gender>
<addr>朝阳区</addr>
</Person>
3.循环标签/元素
1.javaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person {
@XmlAttribute(name="id")
private String id;
@XmlElement(name="name")
private String name;
@XmlElement(name="gender")
private String gender;
@XmlElement(name="addrs")
private List<Addr> addrs;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="addr")
public class Addr {
@XmlElement(name="province")
private String province;
@XmlElement(name="city")
private String city;
@XmlElement(name="area")
private String area;
}
2.Test
public static void main(String[] args) {
final Addr addr = new Addr("北京市","通州区","永顺镇");
List<Addr> adds = new ArrayList<>();
adds.add(addr);
Person person = new Person("abc", "男", "北京", adds);
File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
generateXML(file,Person.class,person);
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
<name>男</name>
<gender>北京</gender>
<addrs>
<province>北京市</province>
<city>通州区</city>
<area>永顺镇</area>
</addrs>
</Person>
4.元素文本
@XmlValue: 定义xml元素文本值的类型
如果类具有 @XmlElement 属性, 则不能具有 @XmlValue 属性。
1.javaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "addr")
public class Addr {
@XmlAttribute(name = "province")
private String province;
@XmlAttribute(name = "city")
private String city;
@XmlAttribute(name = "area")
private String area;
@XmlValue
private String value;
}
2.Test
public static void main(String[] args) {
final Addr addr = new Addr("北京市","通州区","永顺镇","源盛东街66号");
List<Addr> adds = new ArrayList<>();
adds.add(addr);
Person person = new Person("abc", "男", "北京", adds);
File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
generateXML(file,Person.class,person);
}
测试结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
<name>男</name>
<gender>北京</gender>
<addrs province="北京市" city="通州区" area="永顺镇">源盛东街66号</addrs>
</Person>
javaBean2xml
1.包含上面所有场景
1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
<name>男</name>
<gender>北京</gender>
<addrs province="北京市" city="通州区" area="永顺镇">源盛东街66号</addrs>
</Person>
2.javaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person {
@XmlAttribute(name="id")
private String id;
@XmlElement(name="name")
private String name;
@XmlElement(name="gender")
private String gender;
@XmlElement(name="addrs")
private List<Addr> addrs;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "addr")
public class Addr {
@XmlAttribute(name = "province")
private String province;
@XmlAttribute(name = "city")
private String city;
@XmlAttribute(name = "area")
private String area;
@XmlValue
private String value;
}
3.Test
public class DemoTest {
public static <T> T generateBean(File file, Class<T> beanClazz) {
T t = null;
try {
JAXBContext jc = JAXBContext.newInstance(beanClazz);
Unmarshaller uma = jc.createUnmarshaller();
t = (T) uma.unmarshal(file);
System.out.println(t);
} catch (JAXBException e) {
e.printStackTrace();
}
return t;
}
public static <T> T generateBean(String xml, Class<T> beanClazz) {
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(beanClazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
System.out.println(e);
}
return t;
}
public static void main(String[] args) {
File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
Person person = generateBean(file, Person.class);
System.out.println("person:");
System.out.println(person);
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<Person id=\"abc\"><name>男</name><gender>北京</gender><addrs province=\"北京市\" city=\"通州区\" area=\"永顺镇\">源盛东街66号</addrs></Person>\n";
Person person2 = getMarkBean(xml, Person.class);
System.out.println("person2:");
System.out.println(person2);
}
}
测试结果:
person:
Person(id=abc, name=男, gender=北京, addrs=[Addr(province=北京市, city=通州区, area=永顺镇, value=源盛东街66号)])
person2:
Person(id=abc, name=男, gender=北京, addrs=[Addr(province=北京市, city=通州区, area=永顺镇, value=源盛东街66号)])
JAXB常用注解
版权声明:本文为QQ657205470原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。