You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用xmlstarlet更新含HTML编码字符的Tomcat配置属性值

解决xmlstarlet更新XML属性时HTML编码字符重复转义的问题

我在更新Tomcat的server.xml配置文件中AccessLogValve的pattern属性时,遇到xmlstarlet对HTML编码字符重复转义的问题:

现有XML配置

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost">
        <Valve className="org.apache.catalina.valves.AccessLogValve" pattern="UPDATE-THIS"/>
      </Host>
    </Engine>
  </Service>
</Server>

执行的错误命令

xmlstarlet edit \
    --update "/Server/Service[@name='Catalina']/Engine[@name='Catalina']/Host[@name='localhost']/Valve[@className='org.apache.catalina.valves.AccessLogValve']/@pattern" -v "%h %l %u %t &quot;%r&quot; %s %b" \
    "$CATALINA_HOME/conf/server.xml"

问题现象

执行后pattern属性值变为:

"%h %l %u %t &amp;quot;%r&amp;quot; %s %b"

而预期结果是:

"%h %l %u %t &quot;%r&quot; %s %b"

可见&quot;被额外转义成了&amp;quot;。

解决方法

问题根源是手动提前编码了双引号为&quot;,但xmlstarlet会自动对属性值中的特殊字符进行XML转义,导致重复编码。正确做法是直接使用原始双引号,让工具自动处理转义:

正确命令

xmlstarlet edit \
    --update "/Server/Service[@name='Catalina']/Engine[@name='Catalina']/Host[@name='localhost']/Valve[@className='org.apache.catalina.valves.AccessLogValve']/@pattern" -v "%h %l %u %t \"%r\" %s %b" \
    "$CATALINA_HOME/conf/server.xml"

说明

  • 在Shell环境中,双引号需要用反斜杠\转义,避免被Shell解析为命令边界;
  • xmlstarlet会自动将属性值中的双引号转换为符合XML规范的&quot;,最终生成的属性值正好匹配预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:20:39