Inserir tag XML customizada em um arquivo XML em um script bash

1

Então, estou tentando criar um script usando o bash para executar arbitrariamente um arquivo de configuração do JBoss XML e, quando vejo uma tag específica, coloco alguns valores personalizados nela.

O XML abaixo é o trecho importante do arquivo de configuração xml de um exemplo do JBoss, o que eu preciso fazer para encontrar as tags no anúncio da tag do grupo de servidores e, em seguida, verificar se a tag está lá, se não , se estiver lá, adicione a tag com os valores nela.

...
<server-groups>
    <server-group name="main-server-group" profile="full">
        <jvm name="default">
            <heap size="64m" max-size="512m"/>
                    <jvm-options>
                        <option value="-agentpath:"<DT_HOME>/agent/lib/libdtagent.so"=name=<AgentName>,server=<dynaTraceCollectorName>"/>
                    </jvm-options>
            </jvm>
            <socket-binding-group ref="full-sockets"/>
        </server-group>
    </server-groups>
</domain>
    
por Hao-lin.Liang 18.08.2017 / 15:32

1 resposta

3

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

  1. Exclua o elemento.
  2. 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 .

    
por 18.08.2017 / 16:07