如何用xmlstarlet命令行工具编辑XML文件

14次阅读

xmlstar 默认不修改原文件,需用 –inplace 或重定向;更新用 -u XPath -v 值,添加节点用 –subnode 或 –insert,删除用 –delete,批量处理需 shell 循环,注意编码命名空间和 XPath 精确性。

如何用xmlstarlet命令行工具编辑XML文件

用 xmlstar 修改 XML 元素内容

xmlstar 默认不修改原文件,必须显式用 --inplace 或重定向输出。想把 old 改成 new,最常用的是 ed(edit)子命令:

xmlstar --inplace -u "//name" -v "new" file.xml

注意:-u 是 update 的缩写,后面跟 XPath 表达式;-v 指定新值。如果匹配多个节点,全部都会被更新。XPath 中的双引号需转义或改用单引号避免 shell 解析错误。

  • 路径中含空格或特殊字符?用单引号包裹 XPath:'//user/name'
  • 只想改第一个匹配项?加 [1]//name[1]
  • 原值含换行或 html 实体?xmlstar 会自动转义,无需手动处理

用 xmlstar 添加新节点

添加子节点用 --subnode,添加同级节点用 --insert。比如在每个 下追加一个 active

xmlstar --inplace --subnode "//user" --type elem -n status -v active file.xml

关键参数含义:--subnode 指定父节点路径;--type elem 表示插入元素节点(不是属性);-n 是 name;-v 是 value。

  • 要加属性?把 --type elem 换成 --type attr,且 -n 改为属性名,如 id
  • 插入位置不对?--subnode 总是追加到末尾;要用 --insert + --next--first 控制顺序
  • 父节点不存在?命令静默失败,建议先用 sel 子命令验证路径是否命中:xmlstar sel -t -v "//user" file.xml

用 xmlstar 删除节点或属性

删除用 --delete,后面直接跟 XPath。例如删掉所有 节点:

xmlstar --inplace --delete "//temp" file.xml

删属性更简单,XPath 指向属性即可,比如删掉 中的 id 属性:

xmlstar --inplace --delete "//user/@id" file.xml

注意:XPath 中属性用 @ 前缀,这是必须的,漏掉就删不掉。

  • 删完文件变空?检查 XPath 是否误匹配了根节点,比如 /* 会删整个文档
  • 想删文本节点?用 text() 函数://name/text()
  • 不确定删对没?先去掉 --inplace,用管道看效果:xmlstar ed --delete "//temp" file.xml | head -5

xmlstar 批量处理多个文件时的坑

xmlstar 不支持通配符批量传参,xmlstar --inplace -u "//x" -v y *.xml 会报错。正确做法是用 shell 循环:

for f in *.xml; do xmlstar --inplace -u "//version" -v "2.1" "$f"; done

另一个常见问题编码。xmlstar 默认按 UTF-8 解析,如果文件是 GBK 或 ISO-8859-1,会报 encoding Error。此时需加 --xmlpi--encoding 参数强制指定:

xmlstar --inplace --encoding GBK -u "//title" -v "中文标题" file.xml

--encoding 必须放在所有操作参数之前,否则无效。

  • windows 上路径含空格?用双引号包裹变量:"$f"
  • 想跳过格式损坏的文件?加 2>/dev/NULL || true 忽略错误,但不推荐——应先用 xmllint --noout file.xml 验证合法性
  • 修改后 XML 缩进乱了?xmlstar 不保留原始格式,如需美化,得额外用 xmllint --format 管道处理

实际编辑 XML 时,最易忽略的是 XPath 的上下文和命名空间。没声明 Namespace 的 XML,用默认无前缀方式即可;但带 xmlns="http://example.com/ns" 的文件,必须先用 --net 注册前缀,否则所有 XPath 都不匹配。

text=ZqhQzanResources