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>
XMLStarletを使用すると、要素にサブノードを追加したり、既存の要素を更新したりできます。要素が存在する場合と存在しない場合の両方をカバーするために、
追加したい要素が<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
と呼ばれることがあります。