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

如何用xmlstarlet查找指定字符串、删除对应节点并追加节点

使用xmlstarlet修改XML文件的节点操作

原始FILE.XML内容

<File>${IB}/OP/views/ACCOUNT.xml</File>
      <File>${IB}/OP/views/EMPLOYEES.xml</File
      <File>${IB}/OP/views/STATUS.xml</File>

需求

  1. 检查文件中是否存在匹配ACCOUNT.xml的<File>节点
  2. 若存在,在该节点下方追加两个新节点:
    <File>${IB}/OP/views/ACCOUNT_MAIN.xml</File>
    <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File>
    
  3. 删除原有的ACCOUNT.xml节点
  4. 最终文件效果:
    <File>${IB}/OP/views/ACCOUNT_MAIN.xml</File>
       <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File>
       <File>${IB}/OP/views/EMPLOYEES.xml</File
       <File>${IB}/OP/views/STATUS.xml</File>
    

解决方案

操作顺序:必须先追加,再删除

只有保留原ACCOUNT.xml节点,才能通过它定位新节点的插入位置;如果先删除原节点,就无法指定新节点要放置的位置,导致新节点可能被添加到XML的其他区域。

修正并合并xmlstarlet命令

先修正你原有删除命令中的两处错误:

  • XPath路径中的view应为views(匹配原文件的完整路径)
  • 文本匹配需包含完整的${IB}(原节点文本包含$符号)

以下是合并了追加和删除操作的完整命令,可一次性完成所有修改:

xmlstarlet ed -L \
  -a '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' -t elem -n File -v '${IB}/OP/views/ACCOUNT_MAIN.xml' \
  -a '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' -t elem -n File -v '${IB}/OP/views/ACCOUNT_SECONDARY.xml' \
  -d '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' \
  ${HOME}/FILE.XML

参数说明

  • -L:直接在原文件上修改(原地编辑)
  • -a <xpath>:在指定XPath匹配的节点之后追加新元素
  • -t elem:声明要创建的是元素节点
  • -n File:指定新元素的名称为File
  • -v <value>:设置新元素的文本内容
  • -d <xpath>:删除指定XPath匹配的节点

执行逻辑

  1. 先在原ACCOUNT.xml节点后追加第一个新节点ACCOUNT_MAIN.xml
  2. 再次在原ACCOUNT.xml节点后追加第二个新节点ACCOUNT_SECONDARY.xml(此时原节点仍存在,XPath可正确匹配)
  3. 最后删除原ACCOUNT.xml节点,得到目标格式的XML文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:46:06