次のデータファイルがあります。
<Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
<Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 1" />
<Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
<Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name1" />
</Key>
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name2" />
</Key>
</Key>
<Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
<Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 2" />
<Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
<Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name3" />
</Key>
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name4" />
</Key>
</Key>
目的のレコードのログイン名を知っており、それをグループと一致させる必要があります。グループが何であるかを知りたいとしましょうname3
(答えはですgroup 3
)。現在、以下からファイルからグループ名を取得できます。
perl -ne 'print "$_\n" foreach /name="rsv-group-name".*\ data="([^"]*)"/g;'
しかし、ユーザーとどのように一致させるのかわかりません。スクリプトでこれをどのように実行できますか?
ベストアンサー1
group 2
代わりに、グループは次のとおりですgroup 3
。
xmlstarlet sel -t \
-v '//Key[Key/Value[@name="rsv-login-name" and @data="name3"]]/Value[@name="rsv-group-name"]/@data' -nl file.xml
または、コマンドラインから取得したクエリ値を使用してください。
xmlstarlet sel -t --var data="'name3'" \
-v '//Key[Key/Value[@name="rsv-login-name" and @data=$data]]/Value[@name="rsv-group-name"]/@data' -nl file.xml
または、
xmlstarlet sel -t --var data="'name3'" \
-m '//Key/Key/Value[@name="rsv-login-name" and @data=$data]' \
-v '../../Value[@name="rsv-group-name"]/@data' -nl file.xml
これらのいずれかの出力はですgroup 2
。
XPathクエリは、Key/Key/Value
およびあるノードを探し、そのノードがノードの場合はあるノードの属性を返します。name="rsv-login-name"
data="name3"
Key
Key/Value
data
Value
name="rsv-group-name"
ここで使用しているXMLは、正しい形式のXML文書を作成するために先頭に<root>
タグを追加し、最後に閉じるタグを追加するわずかに変更された文書です。</root>