Hutool XML 操作教程

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

注意事项

  1. XPath 依赖:使用 XPath 功能需要 JDK 自带的支持,无需额外依赖

  2. 命名空间:处理带命名空间的 XML 时,XPath 需要正确设置命名空间上下文

  3. 性能:大文件解析建议使用 SAX 方式而非 DOM

  4. 编码:默认使用 UTF-8 编码,可通过参数指定其他编码

Hutool 的 XmlUtil 封装了 JDK 原生 XML 操作,简化了常用场景,对于复杂 XML 建议直接使用 JDOM 或 XStream。

相关推荐
qq_424098562 小时前
如何分析enq- TM - contention_外键未建索引导致的表级锁阻塞
jvm·数据库·python
淘矿人2 小时前
2026大模型API中转平台深度评测:weelinking领衔五大服务商横向实测与选型指南
开发语言·人工智能·python·oracle·数据挖掘·php·pygame
qq_334563552 小时前
如何让水平滚动条始终固定在页面底部可见
jvm·数据库·python
码农小旋风2 小时前
2026 最新 Claude Code Windows 安装教程:Node、Git Bash、命令检查一步步配好
windows·git·bash·claude
embrace_the_sunhaha2 小时前
MATLAB->WinC-UnbuntuC
windows·硬件工程
HHHHH1010HHHHH2 小时前
Golang怎么用Go实现待办事项API_Golang如何用RESTful风格实现Todo应用后端接口【教程】
jvm·数据库·python
weixin_381288182 小时前
CSS代码如何快速重构_使用Sass的@import逻辑重组结构
jvm·数据库·python
m0_716430072 小时前
Go语言怎么做自动补全_Go语言CLI自动补全教程【经典】
jvm·数据库·python
金融大 k2 小时前
Python + Redis 实时行情共享:WebSocket 数据流的订阅管理与断线恢复实践
redis·python·websocket