如何在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
相关产品推荐
相关产品推荐

