从 shell 脚本解析 XML

从 shell 脚本解析 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 是一个稍微修改过的文档,它<root>在开始处添加了一个标记,</root>在末尾添加了一个结束标记,只是为了使其成为格式良好的 XML 文档。

答案2

查看 usling xslt 脚本来转换或解析您的 XML,xsltproc 是您正在寻找的二进制文件,w3cschools 有一个很好的入门指南。

答案3

awk解决方案。

$ awk -F= '/name="rsv-group-name"/{g=$NF}/data="name4"/{print substr(g,2,length(g)-5)}' inputfile

相关内容