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

用 xmlstar 修改 XML 元素内容
xmlstar 默认不修改原文件,必须显式用 --inplace 或重定向输出。想把 改成 ,最常用的是 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。比如在每个 下追加一个 :
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管道处理
xmlns="http://example.com/ns" 的文件,必须先用 --net 注册前缀,否则所有 XPath 都不匹配。










