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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:24