xmlstarlet是一款功能强大的XML命令行处理工具,支持XML的解析、查询、编辑、验证等多种操作,在Bash脚本中结合该工具可以快速完成XML文件的批量处理任务,无需编写复杂的解析代码。

xmlstarlet的安装方法
不同Linux发行版的安装命令有所不同,常见安装方式如下:
- Ubuntu/Debian系统:执行
sudo apt-get install xmlstarlet命令安装 - CentOS/RHEL系统:执行
sudo yum install xmlstarlet命令安装 - Arch Linux系统:执行
sudo pacman -S xmlstarlet命令安装
安装完成后可以执行xmlstarlet --version命令验证是否安装成功,出现版本信息则说明安装正常。
xmlstarlet核心命令说明
xmlstarlet包含多个子命令,常用的子命令及功能如下:
| 子命令 | 功能说明 |
|---|---|
| sel | 查询XML文件中的节点、属性内容 |
| ed | 编辑XML文件,支持修改、新增、删除节点或属性 |
| val | 验证XML文件的格式是否符合规范 |
| fo | 格式化XML文件,调整缩进和排版 |
常见操作示例
1. 查询XML节点内容
假设存在测试文件test.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<server>
<host>127.0.0.1</host>
<port>8080</port>
<timeout unit="s">30</timeout>
</server>
<user name="admin" role="admin"/>
</config>
查询server下的host节点内容,执行如下命令:
xmlstarlet sel -t -v "/config/server/host" test.xml
命令执行后会输出127.0.0.1,其中-t表示指定模板,-v表示输出匹配节点的文本内容。
如果要查询user节点的name属性值,命令如下:
xmlstarlet sel -t -v "/config/user/@name" test.xml
执行后输出admin,属性前需要加@符号标识。
2. 修改XML节点或属性
使用ed子命令可以修改XML内容,将port节点的值修改为9090,命令如下:
xmlstarlet ed -u "/config/server/port" -v "9090" test.xml
命令执行后会输出修改后的完整XML内容,-u表示更新节点,-v指定新的节点值。如果需要直接修改原文件,可以结合重定向或者-L参数:
xmlstarlet ed -L -u "/config/server/port" -v "9090" test.xml
修改user节点的role属性为user,命令如下:
xmlstarlet ed -L -u "/config/user/@role" -v "user" test.xml
3. 删除XML节点或属性
删除timeout节点,执行如下命令:
xmlstarlet ed -L -d "/config/server/timeout" test.xml
-d参数表示删除匹配的节点,执行后test.xml中的timeout节点会被移除。
如果要删除user节点的role属性,命令如下:
xmlstarlet ed -L -d "/config/user/@role" test.xml
4. 新增XML节点或属性
在server节点下新增一个max_connection节点,值为100,命令如下:
xmlstarlet ed -L -a "/config/server/port" -t elem -n "max_connection" -v "100" test.xml
其中-a表示在指定节点后新增内容,-t elem表示新增元素节点,-n指定节点名称,-v指定节点值。
给user节点新增一个email属性,值为admin@ipipp.com,命令如下:
xmlstarlet ed -L -a "/config/user" -t attr -n "email" -v "admin@ipipp.com" test.xml
5. 格式化XML文件
如果XML文件排版混乱,可以使用fo子命令格式化:
xmlstarlet fo test.xml
命令会输出排版整齐的XML内容,同样可以结合-L参数直接修改原文件。
使用注意事项
- xmlstarlet的XPath语法区分大小写,节点名称和属性名称需要和XML文件中的实际内容完全一致
- 使用
-L参数直接修改文件前,建议先备份原文件,避免修改错误导致数据丢失 - 如果XML文件包含命名空间,查询时需要在命令中指定命名空间前缀,否则可能无法匹配到节点
- 在Bash脚本中使用时,如果XML路径包含特殊字符,需要用单引号包裹XPath表达式,避免被Bash解析
xmlstarletBashXMLXML_parse修改时间:2026-07-08 02:21:13