如何用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 "%r" %s %b" \ "$CATALINA_HOME/conf/server.xml"
问题现象
执行后pattern属性值变为:
"%h %l %u %t &quot;%r&quot; %s %b"
而预期结果是:
"%h %l %u %t "%r" %s %b"
可见"被额外转义成了&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规范的
",最终生成的属性值正好匹配预期结果。
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

