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

如何在Bash中用XML工具复制指定XML节点(已知XPath)

使用XMLStarlet复制指定XPath的XML标签到原标签之后

先安装XMLStarlet

Debian/Ubuntu直接从官方仓库安装:

sudo apt update && sudo apt install xmlstarlet

快速实现方案

针对你的示例XML(目标节点的XPath为/root/item),一条命令即可完成复制并插入到原标签后方:

xmlstarlet edit --append /root --type node --copy /root/item input.xml
  • --append /root:将复制的节点添加到<root>的子节点末尾(正好在原<item>之后)
  • --type node:指定插入内容为XML节点类型
  • --copy /root/item:通过XPath选中需要复制的目标节点
  • 如果需要直接修改原文件,添加-L参数即可:xmlstarlet edit -L ...

如果XML中存在多个同类型节点,要复制特定位置的节点(比如第一个<item>),只需调整XPath:

xmlstarlet edit --append /root --type node --copy /root/item[1] input.xml

复杂场景用XSLT转换

如果需要更精细的控制(比如仅复制满足特定条件的节点),可以使用XSLT转换。先创建copy-node.xsl文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 保留原XML的完整结构 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <!-- 匹配目标节点,复制一份输出 -->
    <xsl:if test="self::item and parent::root">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

执行转换命令:

xmlstarlet tr copy-node.xsl input.xml

关于xmllint

xmllint主要用于XML格式验证、节点查询,本身没有直接的节点编辑插入功能,若使用它需先提取节点再手动插入,流程较为繁琐,因此优先推荐使用XMLStarlet完成需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:45:01