xmlstarlet move 到底是如何工作的

xmlstarlet move 到底是如何工作的

我想在 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

  • countspan- 包含具有子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>

相关内容