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。

相关推荐
zhaoyong2221 小时前
SQL如何统计每个用户的首次行为时间_MIN聚合与分组
jvm·数据库·python
阿虎儿1 小时前
[实战记录] Windows 11 远程桌面已开启,但 3389 端口无监听?终极排查与修复
windows
2501_901006471 小时前
C#怎么实现配置热更新 C#如何在运行时动态刷新配置文件不需要重启程序【技巧】
jvm·数据库·python
m0_470857641 小时前
HTML怎么创建响应式图片备选方案_HTML srcset与sizes结构【详解】
jvm·数据库·python
2301_795099742 小时前
如何优化SQL中大批量数据的物理删除_分批次与间隔控制
jvm·数据库·python
阿kun要赚马内2 小时前
后端数据操作组合:Pydantic与ORM
后端·python·orm·sqlalchemy
2301_812539673 小时前
CSS如何引入CSS形状生成器_通过自定义属性实现图形化样式
jvm·数据库·python
m0_609160493 小时前
Golang怎么实现数据库连接重试_Golang如何在启动时重试连接直到数据库就绪【技巧】
jvm·数据库·python
花米徐3 小时前
技术洞察精选 | 2026年4月28日 — 5月4日
后端·python·flask
宝贝儿好4 小时前
【LLM】第三章:项目实操案例:智能输入法项目
人工智能·python·深度学习·算法·机器人