使用XmlStarlet基于子节点值搜索标记属性值

时间:2015-10-09 11:46:28

标签: xml shell xmlstarlet

我有一个xml文件,其结构如下所示:

        <role name="test" pattern=".*">
            <assignedSIDs>
                <sid>abc</sid>
                <sid>cde</sid>
                <sid>def</sid>
            </assignedSIDs>
        </role>

        <role name="test1" pattern=".*">
            <assignedSIDs>
                <sid>abc</sid>
                <sid>zxc</sid>
                <sid>vbn</sid>
            </assignedSIDs>
        </role>

        <role name="test2" pattern=".*">
            <assignedSIDs>
                <sid>abc</sid>
                <sid>hex</sid>
                <sid>oct</sid>
            </assignedSIDs>
        </role>

我想根据role代码的值找到sid代码名称属性。 例如:如果我搜索abc,则查询必须返回测试,test1test2

我在下面提到了这个链接,得到了一半解决方案。

XMLStarlet Return attribute based on value (Reverse lookup)

我也提到了这个

http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html

但我没有任何能够支持我的要求的例子。

我能做些什么吗?

2 个答案:

答案 0 :(得分:1)

你可以使用的XPath表达式是//role[.//sid = 'abc' ]/@name,xmlstarlet的命令行是xmled.exe sel -t -v "//role[.//sid = 'abc']/@name" input.xml(我认为这取决于你需要用来包装XPath表达式的命令行shell的引号字符)

答案 1 :(得分:0)

即使@ martin-honnen给出的XPATH是正确的,我也没有得到预期的输出。这是因为我的系统中安装了旧版本的xmlstarlet 1.0.1。当我升级到1.6.1时,问题就解决了。
这是链接,@ kjhughes帮助我找到了解决方案 xmlstarlet XPath expression selects single result rather than multiple