xmlをシェルスクリプトのパラメータとして解析する方法

xmlをシェルスクリプトのパラメータとして解析する方法

これは私のサンプルXMLファイルです。 max_sizeを出力にインポートする必要がありますか?

私はxlimitとxpathを使ってみましたが、どちらもうまくいきませんでした。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
   <service_info name="dummyapp" version="5.0"
   <object name="WebApplications">
      <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
   </object>
   <object name="jdbc_oracle_nonxa">
      <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
</object>

答え1

XMLがうまく構成されているとします。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
  <service_info name="dummyapp" version="5.0"/>
  <object name="WebApplications">
    <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
  </object>
  <object name="jdbc_oracle_nonxa">
    <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
  </object>
</weblogic-service>

(質問に閉じていないタグは閉じました)

... この場合、以下が出力されます25(この例の場合)。

xml sel -t -v '//item/@max_size' -nl file.xml

これは使用中ですXMLスターmax_valueすべてのノードの属性値を取得しますitem。最後に、-nl出力の後に改行文字を挿入します。

itemより具体的に説明し、ノード内のノードだけを見なければならない場合は、次のようになります。objectnamejdbc_oracle_nonxa

xml sel -t -v '//object[@name="jdbc_oracle_nonxa"]/item/@max_size' -nl file.xml

XMLStarletはxmlstarletインストールされているのではなく、xml一部のシステムにインストールされることに注意してください。


使用xmllint(出力の終わりに改行なし):

xmllint --xpath 'string(//object[@name="jdbc_oracle_nonxa"]/item/@max_size)' file.xml

答え2

通常、sedまたはgrepを使用する方が高速ですが、安全性が低くなります。

sed -E -n 's/.*max_size="([0-9]+)".*/\1/p' sample-4.xml 
25

またはgrep:

grep -Eo 'max_size="[0-9]+" ' sample-4.xml | grep -Eo "[0-9]+"
25

XMLは検証されず、認識せずにコメント付きのコードを選択できます。画面を見て2つの結果を得ることに気づくかもしれませんが、自動化されたプロセスでそれを使用すると間違いが起こりやすいです。

時には、XMLを生成するプログラムを書いて、他の望ましくないコンテキストからコメントまたはmax_size = "..."を出力するかどうかを知ることができます。これらの制限を知っていれば、sed、grep、awk に問題はありません。ただ美しいxmlstarletの構文を学ぶのを防ぐだけです。 :)

関連情報