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

无ID属性时,如何通过xmlstarlet按顺序修改XML中Connector端口

使用xmlstarlet按顺序修改无ID的端口

当然可以按顺序定位元素来修改端口!你想的位置选择思路完全可行,不过要注意XML路径的小细节——直接写/Connector[1]大概率找不到元素,因为这些通常嵌套在或这类父节点下,得调整路径写法。

先明确你的XML结构(参考你给出的片段)

你的三个应该是类似这样的嵌套结构:

return (<Server ...>
  <Service ...>
    <Connector connectionTimeout="20000" port="9000" protocol="HTTP/1.1" redirectPort="8443" server=" "/>
)
<Connector port="8029" protocol="AJP/1.3" redirectPort="8443"/>
<Connector address="127.0.0.1" connectionTimeout="20000" port="9002" protocol="HTTP/1.1" server=""/>

按顺序修改的具体命令

1. 修改第一个的端口为9500

用//Connector[1]匹配任意层级下的第一个(如果知道精确父节点,比如/Server/Service/Connector[1]会更严谨):

xmlstarlet ed --inplace -u "//Connector[1]/@port" -v 9500 server.xml

2. 修改第二个(AJP协议)的端口为8030

xmlstarlet ed --inplace -u "//Connector[2]/@port" -v 8030 server.xml

3. 修改第三个的端口为9003

xmlstarlet ed --inplace -u "//Connector[3]/@port" -v 9003 server.xml

一次性批量修改多个

如果想一次搞定所有修改,可以用多个-u参数:

xmlstarlet ed --inplace \
  -u "//Connector[1]/@port" -v 9500 \
  -u "//Connector[2]/@port" -v 8030 \
  -u "//Connector[3]/@port" -v 9003 \
  server.xml

额外建议:按属性定位更稳妥

虽然按顺序定位简单,但如果以后XML里的顺序发生变化,位置选择就会出错。更可靠的方式是结合protocol属性来定位,比如:

  • 修改第一个HTTP/1.1的端口:
xmlstarlet ed --inplace -u "//Connector[@protocol='HTTP/1.1'][1]/@port" -v 9500 server.xml
  • 修改AJP协议的端口:
xmlstarlet ed --inplace -u "//Connector[@protocol='AJP/1.3']/@port" -v 8030 server.xml

这样即使元素顺序变动,也能精准定位到目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:22