一、
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);
}
}