Com o XMLStarlet, você pode adicionar um subnó a um elemento ou atualizar um elemento existente. Para cobrir o caso quando o elemento existe e quando ainda não existe, podemos
- Exclua o elemento.
- Adicione o elemento com o valor que queremos que ele tenha.
Digamos que o elemento que desejamos adicionar seja <newtag>
e que seu valor seja tagval
. Ele também deve ter um atributo, newattr
, com valor attrval
. Isso significa que o que queremos adicionar é
<newtag newattr="attrval">tagval</newtag>
Para excluir o elemento:
$ xmlstarlet ed -d '//server-group/newtag' file.xml
Para adicionar o elemento com um atributo:
$ xmlstarlet ed -s '//server-group' -t elem -n 'newtag' -v 'tagval' \
-s '//server-group/newtag' -t attr -n 'newattr' -v 'attrval' file.xml
Adicionando estes juntos:
$ xmlstarlet ed -d '//server-group/newtag' \
-s '//server-group' -t elem -n 'newtag' -v 'tagval' \
-s '//server-group/newtag' -t attr -n 'newattr' -v 'attrval' file.xml
Dado o XML de entrada
<?xml version="1.0"?>
<server-groups>
<server-group name="main-server-group" profile="full">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<jvm-options>
<option value="somevalue"/>
</jvm-options>
</jvm>
<socket-binding-group ref="full-sockets"/>
</server-group>
</server-groups>
isso resulta na saída
<?xml version="1.0"?>
<server-groups>
<server-group name="main-server-group" profile="full">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<jvm-options>
<option value="somevalue"/>
</jvm-options>
</jvm>
<socket-binding-group ref="full-sockets"/>
<newtag newattr="attrval">tagval</newtag>
</server-group>
</server-groups>
Observe que a expressão XPath //server-group
corresponderá a todos server_group
elementos no XML de entrada. Se você quiser corresponder apenas àquele cujo atributo name
é main-server-group
, você precisará alterar //server-group
para //server-group[@name="main-server-group"]
.
O XMLStarlet está disponível no link , mas é provável que já exista uma versão pré-empacotada para o seu Unix (use isso). Às vezes, o executável XMLStarlet é chamado apenas de xml
em vez de xmlstarlet
.