web-dev-qa-db-ja.com

bashスクリプトのXMLファイルにカスタムXMLタグを挿入する

Bashを使用してJBoss XML構成ファイルを任意に実行するスクリプトを作成し、特定のタグが表示されたら、カスタム値をその中に挿入しようとしています。

以下のXMLは、JBossの例からのXML構成ファイルの重要なスニペットです。サーバーグループタグで<jvm>タグを見つけて、<jvm-options>タグが存在するかどうかを確認する必要があります。そうでない場合は、追加してください。そこにある場合は、<options>タグに値を追加します。

<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>
2
Hao-lin.Liang

XMLStarletを使用すると、要素にサブノードを追加したり、既存の要素を更新したりできます。要素が存在する場合と存在しない場合の両方をカバーするために、

  1. 要素を削除します。
  2. 必要な値を持つ要素を追加します。

追加したい要素が<newtag>で、その値がtagvalであるとしましょう。また、値newattrを持つ属性attrvalも必要です。つまり、追加したいのは

<newtag newattr="attrval">tagval</newtag>

要素を削除するには:

$ xmlstarlet ed -d '//server-group/newtag' file.xml

属性を持つ要素を追加するには:

$ xmlstarlet ed -s '//server-group'        -t elem -n 'newtag'  -v 'tagval' \
                -s '//server-group/newtag' -t attr -n 'newattr' -v 'attrval' file.xml 

これらを一緒に追加する:

$ 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 

入力XMLを考える

<?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>

これは出力になります

<?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>

XPath式//server-groupは、入力XMLのallserver_group要素に一致することに注意してください。 name属性がmain-server-groupであるものだけを一致させる場合は、//server-group//server-group[@name="main-server-group"]に変更する必要があります。


XMLStarletは http://xmlstar.sourceforge.net/ から入手できますが、Unix用にあらかじめパッケージ化されたバージョンが利用できる可能性があります(それを使用してください)。 XMLStarlet実行可能ファイルがxmlではなくxmlstarletと呼ばれることがあります。

6
Kusalananda