

新闻资讯
技术学院xmlstar 默认不修改原文件,需用 --inplace 或重定向;更新用 -u XPath -v 值,添加节点用 --subnode 或 --insert,删除用 --delete,批量处理需 shell 循环,注意编码、命名空间和 XPath 精确性。
xmlstar 默认不修改原文件,必须显式用 --inplace 或重定向输出。想把 改成 ,最常用的是 ed(edit)子命令:
xmlstar--inplace -u "//name" -v "new" file.xml
注意:-u 是 update 的缩写,后面跟 XPath 表达式;-v 指定新值。如果匹配多个节点,全部都会被更新。XPath 中的双引号需转义或改用单引号避免 shell 解析错误。
'//user/name'
[1]://name[1]
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
删除用 --delete,后面直接跟 XPath。例如删掉所有 节点:
xmlstar --inplace --delete "//temp" file.xml
删属性更简单,XPath 指向属性即可,比如删掉 中的 id 属性:
xmlstar --inplace --delete "//user/@id" file.xml
注意:XPath 中属性用 @ 前缀,这是必须的,漏掉就删不掉。
/* 会删整个文档text() 函数://name/text()
--inplace,用管道看效果:xmlstar ed --delete "//temp" file.xml | head -5
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 必须放在所有操作参数之前,否则无效。
"$f"
2>/dev/null || true 忽略错误,但不推荐——应先用 xmllint --noout file.xml 验证合法性xmllint --format 管道处理xmlns="http://example.com/ns" 的文件,必须先用 --net 注册前缀,否则所有 XPath 都不匹配。