说明:当我们在工作中需要将数据转为XML文件、或者读取解析XML文件时,使用Hutool工具包中的XMLUtil相关方法是最容易上手的方法,本文介绍如何使用Hutool工具包来解析、生成XML文件。
开始之前,需要导入Hutool工具包的依赖
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.8.6version>
dependency>
如下面这个XML文件
<data>
<books>
<book>
<title>《许三观卖血记》title>
<author>余华author>
<publish>作家出版社publish>
book>
<book>
<title>《罪与罚》title>
<author>陀思妥耶夫斯基author>
<publish>浙江文艺出版社publish>
book>
<book>
<title>《白夜》title>
<author>陀思妥耶夫斯基author>
<publish>上海译文出版社publish>
book>
books>
data>
经分析,从外至里,我们需要创建以下对象:
(data标签对象,里面包含了books标签对象)
import cn.hutool.core.annotation.Alias;
import lombok.Data;
import java.io.Serializable;
@Data
public class DataBean implements Serializable {
/**
* 数据包
*/
@Alias("books")
private BooksBean books;
}
(books标签对象,里面有book对象,并且是一个集合)
import cn.hutool.core.annotation.Alias;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class BooksBean implements Serializable {
/**
* 书籍列表
*/
@Alias("book")
private List<BookBean> books;
}
(book对象,里面是多个属性)
import cn.hutool.core.annotation.Alias;
import lombok.Data;
import java.io.Serializable;
@Data
public class BookBean implements Serializable {
/**
* 书名
*/
@Alias("title")
private String title;
/**
* 作者
*/
@Alias("author")
private String author;
/**
* 出版社
*/
@Alias("publish")
private String publish;
}
需要注意,对应属性上面的注解以及注解里面的名称需要与xml中的标签名对应;
解析XML代码;
// 读取xml文件
String xml = FileUtil.readString(new File("data.xml"), "UTF-8");
// 将xml转换为java对象
Element rootElement = XmlUtil.getRootElement(XmlUtil.parseXml(xml));
// 使用根节点下的直接 转成对象
DataBean dataBean = XmlUtil.xmlToBean(rootElement, DataBean.class);
// 输出对象数据
System.out.println(dataBean.getBooks().getBooks());
解析完成
对象转XML是相反的过程,先组装数据,成一个对象。然后依次创建节点标签,将数据放入到标签中。
// 制造数据
BookBean bookBean = new BookBean();
bookBean.setTitle("《活着》");
bookBean.setAuthor("余华");
bookBean.setPublish("作家出版社");
// 创建Books对象
List<BookBean> beans = new ArrayList<>();
beans.add(bookBean);
// 创建xml对象
Document document = XmlUtil.createXml();
// 创建data节点
Element data = document.createElement("data");
document.appendChild(data);
// 创建books节点
Element books = document.createElement("books");
data.appendChild(books);
// 创建book节点
Element book = document.createElement("book");
books.appendChild(book);
// 填充数据
for (BookBean bean : beans) {
Element title = document.createElement("title");
title.setTextContent(bean.getTitle());
book.appendChild(title);
Element author = document.createElement("author");
author.setTextContent(bean.getAuthor());
book.appendChild(author);
Element publish = document.createElement("publish");
publish.setTextContent(bean.getPublish());
book.appendChild(publish);
}
// 将document对象转换为xml字符串
String xmlStr = XmlUtil.toStr(document);
// 输出
System.out.println(xmlStr);
转换成功;
另外,这里的xml是未格式化的,可以通过下面这个方法,输出格式化后的xml
private String formatXml(Document document) {
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
// 将 Document 转换为 Source
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new StringWriter());
// 使用 Transformer 对象进行格式化
transformer.transform(source, result);
return result.getWriter().toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
将上面的代码换成如下:
// 将document对象转换为xml字符串,并格式化
String xmlStr = formatXml(document);
运行看效果
使用Hutool工具包解析、生成XML文件,使用的是XmlUtil中的XmlUtil.xmlToBean()、XmlUtil.toStr()等方法,另外还有其他方法可供使用,可自行研究。