これは私のサンプル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
より具体的に説明し、ノード内のノードだけを見なければならない場合は、次のようになります。object
name
jdbc_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の構文を学ぶのを防ぐだけです。 :)