如何通过终端命令将XML子标签<e>复制到上一级节点
用xmlstarlet实现XML子标签复制上移
要实现将每个<product>节点下<c>中的<e>标签复制一份到<b>之后,推荐使用专门的XML命令行工具xmlstarlet,避免用文本处理工具(如sed)因XML结构变化导致的匹配错误。
步骤1:安装xmlstarlet
- Debian/Ubuntu系:
sudo apt update && sudo apt install xmlstarlet - CentOS/RHEL系:
sudo yum install xmlstarlet
步骤2:执行修改命令
直接修改原文件(谨慎操作)
xmlstarlet edit -L -P -S \ --match '/products/product' \ --insert './b' --type elem -n e -v './c/e/text()' \ input.xml
输出到新文件(保留原文件)
xmlstarlet edit -P -S \ --match '/products/product' \ --insert './b' --type elem -n e -v './c/e/text()' \ input.xml > output.xml
参数说明
-L:直接修改输入文件(省略则输出到终端)-P:保留XML原有的缩进格式-S:保留XML中的空格--match '/products/product':匹配所有<product>节点--insert './b':在当前<product>下的<b>元素之后插入新元素--type elem -n e:指定插入的是名为e的元素节点-v './c/e/text()':将新<e>元素的文本内容设为当前<product>下<c>/<e>的文本内容
验证效果
执行命令后,原输入XML会被修改为目标结构:
输入XML(示例):
<products> <product> <a>A content</a> <b>B content</b> <c> <d>d content</d> <e>e content</e> </c> </product> </products>转换后XML:
<products> <product> <a>A content</a> <b>B content</b> <e>e content</e> <c> <d>d content</d> <e>e content</e> </c> </product> </products>
内容的提问来源于stack exchange,提问作者weby
相关产品推荐
相关产品推荐

