Como exatamente o xmlstarlet move o trabalho

2

Eu quero mover elementos em um documento xml com xmlstarlet

Especificamente, quero fazer as seguintes alterações

<parent>
    <before/>
    <span><a>blah</a></span>
    <after/>  
<parent>
<otherparent>
    <span><a>blah</a></span>
<otherparent>

torna-se ..

<parent>
    <before/>
    <a>blah</a>
    <after/>
</parent>
<otherparent>
    <a>blah</a>
</otherparent>

Exclua o intervalo, mas mantenha os filhos.

xmlstarlet tem um comando de movimento: xmlstart ed -m destino de origem mas eu não realmente entende como funciona.

Ele usa uma origem e um xpath de destino, mas eu não entendo como eles são combinados porque podem resultar em conjuntos de tamanhos diferentes. O alvo é relativo à fonte?

    
por Att Righ 31.10.2017 / 17:38

1 resposta

1

Solução xmlstarlet complexa:

Insira o arquivo xml test.xml :

<div>
  <parent>
    <before/>
    <span>
      <a>value 1</a>
    </span>
    <after/>
  </parent>
  <otherparent>
    <span>
      <a>value 2</a>
    </span>
  </otherparent>
</div>

O trabalho:

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 - variável contendo o número de span nós que têm filho a node

  • ed - modo de edição

  • -L - modifica o arquivo no local

  • -a - ação de anexação

  • -d - excluir ação

O final test.xml (após o processamento):

<?xml version="1.0"?>
<div>
  <parent>
    <before/>
    <a>value 1</a>
    <after/>
  </parent>
  <otherparent>
    <a>value 2</a>
  </otherparent>
</div>
    
por 31.10.2017 / 19:41