シェルスクリプトからXMLを解析する

シェルスクリプトからXMLを解析する

次のデータファイルがあります。

<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"KeyKey/ValuedataValuename="rsv-group-name"

ここで使用しているXMLは、正しい形式のXML文書を作成するために先頭に<root>タグを追加し、最後に閉じるタグを追加するわずかに変更された文書です。</root>

おすすめ記事