总体介绍:
@XmlRootElement(name = "root") 该注解是指定根标签,即 <root>...</root>
@XmlElementWrapper(name = "persons") 表示要包裹的List属性子标签的标签,<persons></persons>,不加的话,默认没有这一层标签。
@XmlElement(name = "item") 表示对应的属性包裹的标签:<item></item>,不加的话,默认使用属性名
// 格式化xml输出的格式,true会格式化输出(比较好看,开发时建议打开,上生产建议关闭,因为关闭会省很多空间),false会全部压缩到一起
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 是否打印xml的说明头 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
// 设置为true表示不打印,设置为false表示打印,默认打印
marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE);
详细信息如下:
将对象转换成xml字符串的工具类:
package jol;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
public class TextUtils {
public static String convertToXml(Object obj) {
// 用于打印输出信息
StringWriter sw = new StringWriter();
try {
// 通过传入的类,创建改类的转换上下文
JAXBContext context = JAXBContext.newInstance(obj.getClass());
//创建实例
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式,true会格式化输出,false会全部压缩到一起
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 是否打印xml的说明头 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
// 设置为true表示不打印,设置为false表示打印,默认打印
marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
System.out.println(String.format("错误转换信息,详情%s",e.getMessage()));
}
return sw.toString();
}
}
需要格式化的输出的顶层对象:
package jol;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
// XML文件中的根标识,这个可以随便填
@XmlRootElement(name = "root")
// 控制JAXB 绑定类中属性和字段的排序
public class User implements Serializable {
private static final long serialVersionUID = 1L;
// 用户Id
private Integer userId;
// 用户名
private String userName;
// 用户密码
private String password;
// 用户生日
private Date birthday;
// 用户钱包
private double money;
// 需要包裹子标签
@XmlElementWrapper(name = "persons")
// 子标签单个对象使用的item包裹,如果不配的话
// 将使用person来包括每一个对象
@XmlElement(name = "item")
private List<Person> person;
public User() {
super();
}
public User(int userId, String userName, String password, Date birthday,
double money) {
super();
this.userId = userId;
this.userName = userName;
this.password = password;
this.birthday = birthday;
this.money = money;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public List<Person> getPerson() {
return person;
}
public void setPerson(List<Person> person) {
this.person = person;
}
@Override
public String toString() {
return "User [birthday=" + birthday + ", money=" + money
+ ", password=" + password + ", userId=" + userId
+ ", userName=" + userName + "]";
}
}
顶层对象的子对象:
package jol;
public class Person {
public Person() {
}
private String name;
private String age;
public Person(String name) {
this.name = name;
}
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
测试类:
package jol;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class TestText {
public static void main(String[] args) {
// 需要格式化的类
User user = new User();
user.setBirthday(new Date());
user.setMoney(19.0D);
user.setPassword("jeffchan");
List<Person> peoples = Arrays.asList(
new Person("jeff.chan", "123"),
new Person("jeff.chan1", "1234"));
user.setPerson(peoples);
System.out.println(TextUtils.convertToXml(user));
}
}
测试输出结果:
<root>
<password>jeffchan</password>
<birthday>2020-12-23T19:49:42.043+08:00</birthday>
<money>19.0</money>
<persons>
<person>
<age>123</age>
<name>jeff.chan</name>
</person>
<person>
<age>1234</age>
<name>jeff.chan1</name>
</person>
</persons>
</root>