
次のXML塊を取得しようとしています。
<machine name="sample1" min="1" max="10" idleTime="300" backend="ABC,XYZ">
<handler className="com.abc.xyz.qwerty.foo.FooBar" />
<details queue="ABC.SAMPLE" suggExpiry="30" minExpiry="4" maxExpiry="500"/>
</machine>
詳細キューは入力パラメーターとして使用されます。
マシン名(@ブロックで始まる)が私のパラメータのときに成功しました。
awk '/<machine.*name="sample1"/,/<\/machine>/' Target.xml
入力パラメータが詳細キュー(@block中間)の場合、同じxmlブロックをどのように取得できますか?
答え1
この問題の1つの観点は次のとおりですawk
。
awk '
/<machine.*name=/ { f=1 ; m=0 ; res="" }
f { res = res $0 ORS }
f && /PATTERN/ { m=1 }
/<\/machine>/ { f=0 ; if (m) print res $0 }
' your_XML_file
FSAを実施しています。フラグは、f
必要な XML ブロックに存在するかm
どうかを制御し、フラグは、エントリがそのブロックで見つかったかどうかを示し、res
ブロックを記憶するために使用され、条件が一致した場合、ブロックの最後に印刷されます。
探している実際のパターンを置き換える必要がありますPATTERN
。たとえば、オープン<details queue="ABC.SAMPLE"
XMLタグと閉じるXMLタグの間で検索されます。<machine>
答え2
コマンドラインで使用し、xmlstarlet
値を引数として提供します。queue
xmlstarlet sel -t --var queue="'ABC.SAMPLE'" -c \
'//machine[details[@queue = $queue]]' -nl file.xml
これにより、子と属性値をmachine
持つすべてのノードのコピーが返されます。details
query
ABC.SAMPLE