使用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 "[]|{}^\`"<>" \ server.xml # 替换双重转义的内容 sed -i 's/&#/&#/g' server.xml
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

