Hutool 提供了简洁的 XML 解析和操作工具类 XmlUtil,让 XML 处理更加便捷。
1. 引入依赖
XML
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
2. 读取 XML 文件
java
// 从文件读取
File xmlFile = new File("config.xml");
Document document = XmlUtil.readXML(xmlFile);
// 从字符串读取
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><name>张三</name></root>";
Document doc = XmlUtil.parseXml(xmlStr);
3. 创建 XML 文档
java
// 创建根元素
Document doc = XmlUtil.createXml();
Element root = doc.createElement("books");
doc.appendChild(root);
// 添加子元素
Element book = doc.createElement("book");
book.setAttribute("id", "1");
Element title = doc.createElement("title");
title.setTextContent("Java从入门到放弃");
book.appendChild(title);
root.appendChild(book);
4. 使用 XmlParser 快速解析
java
String xml = "<root><user name='张三' age='25'/><user name='李四' age='30'/></root>";
// 解析为 Element 对象
Element rootElement = XmlUtil.parseXml(xml).getDocumentElement();
// 获取根元素名称
String rootName = rootElement.getNodeName(); // root
// 获取子元素列表
List<Element> users = XmlUtil.getElements(rootElement, "user");
for (Element user : users) {
String name = user.getAttribute("name");
String age = user.getAttribute("age");
System.out.println(name + " - " + age);
}
5. XPath 解析
java
String xml = "<?xml version=\"1.0\"?>" +
"<students>" +
" <student id='1'>" +
" <name>小明</name>" +
" <age>18</age>" +
" </student>" +
" <student id='2'>" +
" <name>小红</name>" +
" <age>17</age>" +
" </student>" +
"</students>";
Document doc = XmlUtil.parseXml(xml);
// 使用 XPath 获取单个节点
Node nameNode = XmlUtil.getNodeByXPath("//student[@id='1']/name", doc);
String name = nameNode.getTextContent(); // 小明
// 获取节点列表
List<Node> studentNodes = XmlUtil.getNodeListByXPath("//student", doc);
// 获取节点值
String age = XmlUtil.getByXPath("//student[@id='2']/age/text()", doc, String.class);
6. XML 转 Map
java
String xml = "<user><name>张三</name><age>25</age><address>北京</address></user>";
Document doc = XmlUtil.parseXml(xml);
// 将 XML 转换为 Map
Map<String, Object> map = XmlUtil.xmlToMap(doc.getDocumentElement());
System.out.println(map); // {name=张三, age=25, address=北京}
7. Map 转 XML
java
Map<String, Object> map = new HashMap<>();
map.put("name", "李四");
map.put("age", 30);
map.put("city", "上海");
// Map 转 XML 字符串
String xml = XmlUtil.mapToXml(map, "user");
System.out.println(xml);
// 输出: <user><name>李四</name><age>30</age><city>上海</city></user>
8. 对象转 XML
java
// 定义实体类
@Data
public class User {
private String name;
private int age;
private String email;
}
User user = new User();
user.setName("王五");
user.setAge(28);
user.setEmail("wangwu@example.com");
// 对象转 XML(需配合 hutool-json 模块)
String xml = XmlUtil.toXml(user, "user");
9. 格式化 XML
java
String uglyXml = "<root><name>张三</name><age>25</age></root>";
// 格式化输出(带缩进)
String prettyXml = XmlUtil.format(uglyXml);
System.out.println(prettyXml);
/* 输出:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<name>张三</name>
<age>25</age>
</root>
*/
10. 写入 XML 文件
java
Document doc = XmlUtil.createXml();
Element root = doc.createElement("config");
doc.appendChild(root);
root.appendChild(XmlUtil.createElement(doc, "host", "localhost"));
root.appendChild(XmlUtil.createElement(doc, "port", "8080"));
root.appendChild(XmlUtil.createElement(doc, "debug", "true"));
// 写入文件
XmlUtil.writeXml(doc, new File("config.xml"), "UTF-8");
11. 清理和移除节点
java
// 移除节点
Element parent = XmlUtil.getElement(doc, "//parent");
Element child = XmlUtil.getElement(doc, "//child");
XmlUtil.removeElement(parent, child); // 从父节点移除子节点
// 清理文本节点中的空白
XmlUtil.cleanComment(doc); // 清理注释
XmlUtil.cleanWhiteSpace(doc); // 清理空白文本节点
12. 常用工具方法
java
// 获取元素文本
String text = XmlUtil.elementText(element, "tagName");
// 设置元素文本
XmlUtil.setElementText(element, "tagName", "新内容");
// 获取属性值
String attr = XmlUtil.getAttrValue(element, "attrName");
// 判断是否包含指定子元素
boolean hasChild = XmlUtil.hasChild(element, "childName");
完整示例
java
public class XmlDemo {
public static void main(String[] args) {
// 创建 XML
Document doc = XmlUtil.createXml();
Element root = doc.createElement("company");
doc.appendChild(root);
// 添加部门
Element dept = doc.createElement("department");
dept.setAttribute("name", "技术部");
Element employee = doc.createElement("employee");
XmlUtil.setElementText(employee, "name", "张三");
XmlUtil.setElementText(employee, "position", "工程师");
dept.appendChild(employee);
root.appendChild(dept);
// 格式化输出
System.out.println(XmlUtil.format(doc));
// 解析查找
Element found = XmlUtil.getElement(doc, "//employee[name='张三']");
if (found != null) {
String position = XmlUtil.elementText(found, "position");
System.out.println("职位:" + position);
}
}
}
注意事项
-
XPath 依赖:使用 XPath 功能需要 JDK 自带的支持,无需额外依赖
-
命名空间:处理带命名空间的 XML 时,XPath 需要正确设置命名空间上下文
-
性能:大文件解析建议使用 SAX 方式而非 DOM
-
编码:默认使用 UTF-8 编码,可通过参数指定其他编码
Hutool 的 XmlUtil 封装了 JDK 原生 XML 操作,简化了常用场景,对于复杂 XML 建议直接使用 JDOM 或 XStream。