Criando novos elementos com xmlstarlet

Criando novos elementos com xmlstarlet

Tenho tentado adicionar novos elementos a um arquivo XML.

Arquivo original:

<levela>
  <levelb>
  </levelb>
</levela>

Estou tentando obter o seguinte resultado:

<levela>
  <levelb>
    <levelc>
      <element1>value1</element1>
      <element2>value2</element2>
      <element3>value3</element3>
    </levelc>
  </levelb>
</levela>

Minha tentativa atual é:

xmlstarlet ed -a /levela/lelvelb -t elem -n levelc -v "" \
    -i //levelc -t elem -n "element1" -v "value1" \
    file.xml

Mas meu arquivo não está atualizado.

Responder1

Há um erro de digitação na sua xmlstarletinvocação ( lelvelb):

xmlstarlet ed -a /levela/lelvelb -t elem -n levelc -v "" \
    -i //levelc -t elem -n "element1" -v "value1" \
    file.xml

Para adicionar um subnó, você precisa usar a -soperação not -aor -i:

xmlstarlet ed -s /levela/levelb -t elem -n levelc -v "" \
    -s //levelc -t elem -n "element1" -v "value1" \
    file.xml

Isso produz

<?xml version="1.0"?>
<levela>
  <levelb>
  <levelc><element1>value1</element1><element2>value2</element2></levelc></levelb>
</levela>

Você pode adicionar outras -soperações conforme necessário. Você também pode descartar o vazio -vfor levelc.

Se você quiser se modificar file.xml, em vez de obter o resultado da transformação na xmlstarletsaída padrão de, adicione a -Lopção a ed:

xmlstarlet ed -L -s /levela/levelb -t elem -n levelc -v "" \
    -s //levelc -t elem -n "element1" -v "value1" \
    file.xml

informação relacionada