前言
根据leader安排的功能,需要完成指定目录下所有XML通过转换对象存入数据库
后续也会有查询出来数据转XML进行传输、展示
一、根据XML格式创建对应实体类
因为项目里XML的保密性我就不拿出来了,把一个简单的pom.XML来做案例
不过里面也有对象、数组、多个对象
<?xml version="1.0" encoding="UTF-8"?>
<project id="1">
<parent>
<groupId>com.alan</groupId>
<artifactId>alan</artifactId>
<version>2.5.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<modules>
<module>alan-one</module>
<module>alan-two</module>
<module>alan-three</module>
</modules>
<artifactId>alan-modules</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
1)首先是最主要的实体
/**
* 这里是设置类为根节点,但我名字与pom里面不一致所以需要指定name
*/
@XmlRootElement(name = "project")
public class ProjectXml {
/**
* xml节点中的属性 若名字不一致可通过name来指定
*/
@XmlAttribute
private String id;
/**
* xml节点 若名字不一致可通过name来指定
*/
@XmlElement
private ParentXml parent;
@XmlElement
private String modelVersion;
@XmlElement
private ModulesXml modules;
@XmlElement
private String artifactId;
/**
* 使用@XmlElementWrapper注解后,将会在原xml结点上再包装一层xml
* 因为是多个dependency节点,所以需要再创建一个节点包住
*/
@XmlElementWrapper(name = "dependencies")
@XmlElement
private List<DependenciesXml> dependency;
/**
* a.注解解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射
* b.阻止将 JavaBean 属性映射到 XML 表示形式
* @return
*/
@XmlTransient
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
后续的get、set、tostring就不贴了,占地方
2)根据XML里的格式,还需要创建一个对象
创建里面的节点多余的同样节省文章长度
@XmlRootElement(name = "parent")
public class ParentXml {
@XmlElement
private String groupId;
@XmlElement
private String artifactId;
@XmlElement
private String version;
@XmlTransient
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
3)XML里面的数组
使用String[]来接收转换的值
@XmlRootElement(name = "modules")
public class ModulesXml {
@XmlElement
private String[] module;
@XmlTransient
public String[] getModule() {
return module;
}
public void setModule(String[] module) {
this.module = module;
}
@Override
public String toString() {
return "ModulesXml{" +
"module=" + Arrays.toString(module) +
'}';
}
}
4)多个对象实体
这里要注意,@XmlRootElement的name属性是"dependency",因为前面使用了@XmlElementWrapper注解会在<dependency>
节点的上面创建<dependencies>
@XmlRootElement(name = "dependency")
public class DependenciesXml {
@XmlElement
private String groupId;
@XmlElement
private String artifactId;
@XmlElement
private String version;
@XmlTransient
public String getGroupId() {
return groupId;
}
二、编写JaxbUtil工具类
xml转JavaBean
public static <T> T xmlConversionJavabean(String xml, Class<T> c) {
T t = null;
try {
// 调用成功创建了一个可解析示例 xxx.xml 文件的上下文
JAXBContext context = JAXBContext.newInstance(c);
// 创建一个<t> Unmarshaller <t>对象,该对象可用于将XML数据转换为Java内容树。
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
运行结果
JavaBean转xml
运行结果
总结
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
以上就是今天要讲的内容,本文仅仅简单介绍了JAXB的使用,而JAXB提供了大量能使我们快速便捷地处理数据的函数和方法。