JAXB,在jdk6/7/8中可以正常使用;在jdk9/10中由于模块化,不包含在内,需要虚拟机添加参数--add-modules java.xml.bind,加入java.xml.bind模块;不支持的jdk推荐使用maven依赖;
<!-- JAXB start -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- JAXB end -->
对象转xml和xml转对象代码:
/**
* 2018年11月20日下午2:46:27
*/
package testJAXB;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author XWF
*
*/
public class TestJAXB {
/**
* @param args
*/
public static void main(String[] args) {
XmlTest xml = new XmlTest();
xml.Name = "hello";
xml.eLe = 18;
xml.xC = new XmlChild("chchch");
List<String> list = new ArrayList<>();
list.add("hello");
list.add("Tom");
list.add("Jerry");
xml.strs = list;
//将对象写入xml
try {
JAXBContext context = JAXBContext.newInstance(XmlTest.class);
Marshaller m = context.createMarshaller();
File f = new File("xmltest.xml");
m.marshal(xml, f);
} catch (JAXBException e) {
e.printStackTrace();
}
//将xml读取为对象
try {
JAXBContext context = JAXBContext.newInstance(XmlTest.class);
Unmarshaller um = context.createUnmarshaller();
File f = new File("xmltest.xml");
XmlTest xmlObj = (XmlTest) um.unmarshal(f);
xmlObj.show();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
@XmlRootElement(name="MyXml")//指定根目录名字,不使用默认首字母小写的类名xmlTest作为根目录名
class XmlTest{
@XmlAttribute(name="NAME")//指定属性名,默认也是首字母小写
String Name;
@XmlElement
int eLe;//子节点,默认名称不变
@XmlElement
XmlChild xC;
@XmlElement
List<String> strs;
void show() {
System.out.println("Name="+Name);
System.out.println("eLe="+eLe);
System.out.println("xC.name="+xC.name);
System.out.println("strs="+strs);
}
}
class XmlChild{
@XmlElement
String name;
String test = "abc";//没有标注标签不会写入xml
XmlChild(){//读取的时候需要无参的构造方法
}
XmlChild(String n){
name = n;
}
}
结果:
生成和解析的xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyXml NAME="hello">
<eLe>18</eLe>
<xC>
<name>chchch</name>
</xC>
<strs>hello</strs>
<strs>Tom</strs>
<strs>Jerry</strs>
</MyXml>
需要注意的点:
1.如果@XmlRootElement(@XmlAttribute也一样)不配置name="MyXml",默认以首字母小写写入xml,生成的xml根目录是xmlTest;
2.读取xml的时候根目录首字母大写需要使用name配置,java类首字母大写,会首字母小写被表示成xmlTest根目录,无法匹配xml里的根目录;
3.读取xml转化的类需要有无参构造方法,否则会有异常。
4.读取的xml是无BOM格式的。(可以用notepad转一下)
参考:https://blog.csdn.net/oracle_microsoft/article/details/1585664