跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

xmlstarlet命令行工具怎么用 编辑和查询XML

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,需重定向保存。 php版微信js-sdk支付接口类 php版微信js-sdk支付接口类 下载 修改某个属性值(把第一个 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 自动化了。

相关文章