You need to enable JavaScript to run this app. 使用xmlstarlet添加含&的属性值被转义为&如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用xmlstarlet添加含&的属性值被转义为&如何解决

问题原因

XML 规范强制要求:所有非实体引用开头的&字符必须转义为&。xmlstarlet 处理属性值时,默认会把传入的所有内容判定为普通文本,哪怕你写的是合法 XML 实体,它也会把里面的&当成普通字符做转义,所以就出现了\这种双重转义的结果。

解决方法

方案1:直接传入原始字符(推荐)

你不需要手动写 XML 实体,直接传入属性对应的原始字符即可,xmlstarlet 会自动按照 XML 规范转义为你期望的实体形式,完全匹配你要的输出效果。
注意 shell 执行时需要对特殊字符做转义:

xmlstarlet ed -P -L -s "/Server/Service" -t elem -n "Connector" -v "" \
--var Connector '$prev' \
-i "/Server/Service/Connector" -t attr -n "relaxedQueryChars" -v "[]|{}^\`\"<>" \
server.xml

方案2:执行后用sed修正转义(兼容性最好)

如果必须保留手动写的实体写法,可以先按原有逻辑执行,再用sed替换掉所有多余的转义即可:

# 执行原有xmlstarlet逻辑
xmlstarlet ed -P -L -s "/Server/Service" -t elem -n "Connector" -v "" \
--var Connector '$prev' \
-i "/Server/Service/Connector" -t attr -n "relaxedQueryChars" -v "[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" \
server.xml
# 替换双重转义的内容
sed -i 's/&amp;#/&#/g' server.xml

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 17:45:03