xmlstar 是轻量高效的命令行 XML 处理工具,支持 XPath 查询、节点编辑、格式化及命名空间处理;纯 C 实现,无需外部依赖,适用于脚本集成与自动化。

xmlstar 是一个轻量、强大、类 Unix 风格的命令行 XML 处理工具,支持 XPath 查询、节点增删改查、格式化、转换(如转 CSV/JSON)、命名空间处理等。它不依赖外部 XML 库(纯 C 实现),速度快,适合脚本集成。
查询 XML:用 sel(select)子命令 + XPath
最常用场景:从 XML 中提取值或判断结构是否存在。
- 提取所有 book 标题:
xmlstar sel -t -v "//book/title" books.xml - 提取带条件的节点(ISBN 为 978-0-399-15394-8 的作者):
xmlstar sel -t -v "//book[@isbn='978-0-399-15394-8']/author" books.xml - 只检查是否存在某节点(返回 0 或 1):
xmlstar sel -t -c "//config/enabled" config.xml >/dev/null && echo "enabled" || echo "disabled" - 输出带标签名的键值对(便于阅读):
xmlstar sel -t -m "//book" -v "title" -o " — " -v "author" -n books.xml
编辑 XML:用 ed(edit)子命令修改内容
ed 支持增、删、改节点,语法简洁,但注意:它默认输出到 stdout,需重定向保存。
- 修改某个属性值(把第一个 book 的 isbn 改成新值):
xmlstar ed -u "//book[1]/@isbn" -v "978-1-234-56789-0" books.xml > new.xml - 替换文本内容(把所有 title 中的 “Old” 替换为 “New”):
xmlstar ed -u "//title" -x "concat(substring-before(.,'Old'), 'New', substring-after(.,'Old'))" books.xml - 添加新子节点(给第一个 book 加一个
fiction ):xmlstar ed -s "//book[1]" -t elem -n tag -v fiction books.xml - 删除节点(删掉所有 price 节点):
xmlstar ed -d "//price" books.xml
处理带命名空间的 XML
遇到 xmlns 或前缀(如 ),必须先声明命名空间,再在 XPath 中使用前缀。
- 声明 ns 并查 dc:creator:
xmlstar --net -N dc="http://purl.org/dc/elements/1.1/" sel -t -v "//dc:creator" feed.xml - --net 允许加载远程 DTD/XSD(按需启用),-N 是命名空间绑定语法:
-N prefix="URI" - 若 XML 使用默认命名空间(
xmlns="http://example.com/ns"),需显式绑定前缀(如 -N x="http://example.com/ns"),然后用//x:element
实用小技巧与注意事项
- 加
-P自动美化输出(带缩进):xmlstar sel -t -c "//book" -P books.xml - 读取标准输入:
curl -s https://api.example.com/data.xml | xmlstar sel -t -v "//item/name" - 批量处理多个文件:用 shell 循环,例如
for f in *.xml; do xmlstar ed -u "//version" -v "2.1" "$f" > "new_$f"; done - 注意单引号和双引号嵌套:XPath 中含单引号时,外层用双引号;含双引号则外层用单引号,避免 shell 解析错误
基本上就这些。xmlstar 不复杂但容易忽略命名空间和引号细节,多练几次 XPath 表达式,就能高效替代 GUI 工具或写 Python 脚本做 XML 自动化了。










