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

vs3odd8k  于 2023-01-26  发布在  Shell
关注(0)|答案(2)|浏览(157)

我有一个xml文件,其结构类似于input.xml

<myxml>
    <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>
</myxml>

我想根据sid标记的值查找role标记名称属性。例如:如果我搜索abc,查询必须返回test、test1test2
我参考了下面的链接,并得到了一半的解决方案:XMLStarlet Return attribute based on value (Reverse lookup)
我也提到了这一点:http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html
但我没有找到任何例子来支持我的要求。
有什么我能做的吗?

tquggr8v

tquggr8v1#

可以使用的XPath表达式为:
//role[.//sid = 'abc']/@name
xmlstarlet的命令行为:

C:\> xmled.exe sel -t -v "//role[.//sid = 'abc']/@name" input.xml
test
test1
test2

(我认为这取决于您的命令行shell需要使用哪个引号字符来 Package XPath表达式)。

4dbbbstv

4dbbbstv2#

即使@martin-honnen给出的XPATH是正确的,我也没有得到预期的输出。这是由于我的系统中安装了旧版本的xmlstarlet 1.0.1。当我升级到1.6.1时,问题解决了。
这里有一个链接,@kjhughes帮助我找到了xmlstarlet XPath表达式选择单个结果而不是多个结果的解决方案

相关问题