使用xmlstarlet将第二个XML的result元素更新到第一个XML的方法咨询
解决xmlstarlet将第二个XML的result元素更新到第一个XML的问题
我明白你现在的困扰——直接用xmlstarlet ed 1.xml 2.xml只会把两个XML的根节点粗暴合并,根本达不到把第二个文件的result元素更新到第一个里的目的。下面我分两种常见场景给你具体的解决方案,你可以根据自己的XML结构调整:
场景1:第一个XML(1.xml)中已有result元素,需要替换成第二个XML(2.xml)里的result
假设你的XML结构大概是这样(如果你的根节点不是root,记得替换XPath里的对应名称):
1.xml:
<root> <info>some existing content</info> <result> <old-data>outdated content</old-data> </result> </root>
2.xml:
<root> <result> <new-data>fresh content</new-data> </result> </root>
你可以用这条命令直接替换1.xml里的result元素:
xmlstarlet ed -u "/root/result" -x "document('2.xml')/root/result" 1.xml > 3.xml
参数解释:
-u "/root/result":指定要更新的目标节点(1.xml里的result)-x "document('2.xml')/root/result":用XPath从2.xml中读取目标result节点的内容,替换掉1.xml里的对应节点- 最后重定向到3.xml,避免直接修改原文件
如果想要直接修改1.xml(原地更新),可以加上-L参数:
xmlstarlet ed -L -u "/root/result" -x "document('2.xml')/root/result" 1.xml
场景2:第一个XML中没有result元素,需要把第二个XML的result插入到指定位置
同样假设根节点是root,要把result插入到root节点下,用这条命令:
xmlstarlet ed -s "/root" -t copy -f "document('2.xml')/root/result" 1.xml > 3.xml
参数解释:
-s "/root":指定要添加子节点的父节点(这里是根节点root)-t copy:指定操作类型为复制节点-f "document('2.xml')/root/result":指定要复制的源节点(2.xml里的result)
关键注意点
- 一定要根据你实际的XML结构调整XPath路径!比如如果你的根节点不是
root,或者result的父节点不是根,要修改命令里的/root/result为对应的路径。 - 你之前用的
xmlstarlet ed 1.xml 2.xml之所以出错,是因为xmlstarlet ed的语法是xmlstarlet ed [选项] <编辑命令>... <输入文件>——你把2.xml当成了编辑命令参数,而不是要读取内容的文件,所以才会出现合并根节点的错误结果。
内容的提问来源于stack exchange,提问作者Rflow
相关产品推荐
相关产品推荐

