![xmlstarlet move 到底是如何工作的](https://linux22.com/image/120770/xmlstarlet%20move%20%E5%88%B0%E5%BA%95%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84.png)
我想在 xml 文档中移动元素xmlstarlet
具体来说我想进行以下更改
<parent>
<before/>
<span><a>blah</a></span>
<after/>
<parent>
<otherparent>
<span><a>blah</a></span>
<otherparent>
变成..
<parent>
<before/>
<a>blah</a>
<after/>
</parent>
<otherparent>
<a>blah</a>
</otherparent>
即删除跨度但保留子项。
xmlstarlet 有一个移动命令: xmlstart ed -m source target但我不太明白它是如何工作的。
它需要一个源 xpath 和一个目标 xpath,但我不太明白它们是如何匹配的,因为它们可能会产生不同大小的集合。目标相对于源吗?
答案1
复杂的xmlstarlet解决方案:
输入xml文件test.xml
:
<div>
<parent>
<before/>
<span>
<a>value 1</a>
</span>
<after/>
</parent>
<otherparent>
<span>
<a>value 2</a>
</span>
</otherparent>
</div>
工作:
count=$(xmlstarlet sel -t -v 'count(//span[a])' test.xml)
for ((i=1; i<=$count; i++)); do
xmlstarlet ed -L -a '(//span[a])[1]' -t elem -n "a" -v "$(xmlstarlet sel -t -v "(//span/a)[1]" 1.xml)" -d '(//span[a])[1]' test.xml
done
count
span
- 包含具有子a
节点的节点数量的变量ed
- 编辑模式-L
- 就地修改文件-a
- 追加动作-d
- 删除动作
最终test.xml
(处理后):
<?xml version="1.0"?>
<div>
<parent>
<before/>
<a>value 1</a>
<after/>
</parent>
<otherparent>
<a>value 2</a>
</otherparent>
</div>