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。

相关推荐
web守墓人1 分钟前
【python】uv解决依赖安装缓慢的问题
开发语言·python·uv
asdzx673 分钟前
使用 Python 精准操控 Word 字体:获取与替换方案
python·c#·word
胡耀超3 分钟前
固件逆向:从一坨二进制,到一个可以被解释的系统
python·逆向工程·硬件安全·二进制分析·电子数据取证·嵌入式安全·固件逆向
倒流时光三十年1 小时前
MyBatis @MapKey 注解详解
windows·mybatis
生活、追梦者1 小时前
【Windows】 CMD 黑窗口命令大全
windows·命令行·cmd·运维技巧
2501_941982052 小时前
企业微信二次开发:如何用 Python 搭建通用的 Webhook 实时消息接收
开发语言·python·企业微信
在世修行2 小时前
第24篇:PyInstaller打包实战 — 从Python脚本到Windows EXE
人工智能·python·pyinstaller
华研前沿标杆游学2 小时前
2026年制造企业标杆参访实操指南:3步选对适配参访路线
python
Wang ruoxi2 小时前
Pygame 小游戏——一笔画挑战
python·pygame
萧青山2 小时前
AI阅读增强套件:用苏格拉底诘问+对抗性阅读+知识图谱构建深度阅读技能套件(Python实现)
人工智能·python·知识图谱·ai阅读增强