一、
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*实体类
*/
@XmlRootElement(name = "User")//根节点
public class User {
private Integer id;
private String name;
@XmlElement //xml元素
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 测试类
*/
public class BeanToXml {
public static void main(String[] args) throws JAXBException {
JAXBContext jbt = JAXBContext.newInstance(User.class);
User user = new User();
user.setId(1);
user.setName("user1");
Marshaller ms = jbt.createMarshaller();
ms.marshal(user,System.out);//输出到控制台
}
}
测试结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<User>
<id>1</id>
<name>user1</name>
</User>
/**
* pom.xml添加依赖
*/
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
可能出现的问题:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
https://blog.csdn.net/hadues/article/details/79188793
补充:
1.输出到Write,设置属性值等
Marshaller ms = jbt.createMarshaller();
//设置编码等属性
ms.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
ms.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
//输出到Write
StringWriter write = new StringWriter();
ms.marshal(user,write);
System.out.println(write);
2.当为给实体类设置有效属性值:比如,设置实体类字段值为null时,转化XML时会出现节点丢失问题(null值得属性不会转化为节点并输出到文件),可采取一下措施:亲测可用,其他方式遇见持续更新,再次做记录,方便后期回顾
1)编写监听方法
import javax.xml.bind.Marshaller;
import java.lang.reflect.Field;
/**
* 监听类
*/
public class MarshallerListener extends Marshaller.Listener {
public static final String BLANK_CHAR = "";
@Override
public void beforeMarshal(Object source) {
super.beforeMarshal(source);
//反射 获取所有属性
Field[] fields = source.getClass().getDeclaredFields();
for(Field field : fields){
//允许获取私有属性
field.setAccessible(true);
try {
//只针对String类型的,其他类型单独处理
if(field.getType() == String.class && field.get(source) == null){
//设置属性值
field.set(source,BLANK_CHAR);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
2.编写工具类
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
/**
* java实体类转XML工具类
*/
public class JavaBeanToXml {
public static String beanToXmlUtf8(Object obj,Class<?> load) throws JAXBException {
JAXBContext jbt = JAXBContext.newInstance(load);
Marshaller ms = jbt.createMarshaller();
ms.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
ms.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
MarshallerListener listener = new MarshallerListener();
ms.setListener(listener);
StringWriter write = new StringWriter();
ms.marshal(obj,write);
String xmlStr = write.toString();
return xmlStr;
}
}
//实体类
@XmlRootElement(name = "User")
public class User {
private Integer id;
private String name;
@XmlElement
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//测试类
/**
* Unit test for simple App.
*/
public class AppTest
{
@Test
public void beanToXml() throws JAXBException {
User user = new User();
user.setId(2);
user.setName(null);
String xmlStr = JavaBeanToXml.beanToXmlUtf8(user,user.getClass());
System.out.println(xmlStr);
}
}