如何使用xmlstarlet交换XML中两个同级节点的位置?
交换XML同级节点位置的正确方法
问题根源
你第一条命令失效的核心问题是XPath路径写错了——你用了givenname,但原始XML里对应的节点是firstname,路径不匹配导致插入操作根本找不到目标节点。而且这种先复制再删除重命名的思路太绕,xmlstarlet有更直接的方式搞定节点交换。
正确操作方法
方法一:直接移动节点(最简洁)
用xmlstarlet的移动命令-m,把surname节点移到firstname的前面:
xmlstarlet ed -L \ -m "//article/name/surname" -s "//article/name" -p 1 \ swapelment.xml
-m:指定要移动的节点(这里是surname)-s:指定目标父节点(name节点)-p 1:表示插入到父节点下的第一个位置,也就是firstname的前面-L:直接修改原文件
方法二:修正你原来的命令
如果非要沿用你最初的复制-删除-重命名思路,先把XPath的拼写错误改过来:
# 1. 在firstname前插入临时节点surname1,复制原surname的内容 xmlstarlet ed -L -i "//article/name/firstname" -t elem -n surname1 -v "$(xmlstarlet sel -t -v "//article/name/surname" swapelment.xml)" swapelment.xml # 2. 删除原来的surname节点 xmlstarlet ed -L -d "//article/name/surname" swapelment.xml # 3. 把临时节点重命名为surname xmlstarlet ed -L --rename "//article/name/surname1" -v "surname" swapelment.xml
验证结果
执行完命令后,你的XML文件会变成目标结构:
<article> <name> <surname>Pettterson</surname> <firstname>John</firstname> </name> </article>
内容的提问来源于stack exchange,提问作者Ofuuzo
相关产品推荐
相关产品推荐

