使用 XmlStarlet 根据子节点值搜索标签属性值
search tag attribute value based on child node value using 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>
我想根据 sid
标签的值查找 role
标签名称属性。
例如:如果我搜索 abc
,查询必须 return 测试,test1
和 test2
我在下面提到了这个 link 并得到了一半的解决方案。
XMLStarlet Return attribute based on value (Reverse lookup)
我也参考了这个
http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html
但我没有找到任何支持我的要求的示例。
有什么我可以做的吗?
你可以使用的XPath表达式是//role[.//sid = 'abc'
]/@name
,xmlstarlet的命令行是xmled.exe sel -t -v "//role[.//sid = 'abc']/@name" input.xml
(我认为这取决于你的命令行shell你需要使用哪个引号字符包装 XPath 表达式)。
即使@martin-honnen 给出的 XPATH 是正确的,我也没有得到预期的输出。这是由于我的系统中安装了旧版本的 xmlstarlet 1.0.1。当我升级到 1.6.1 时,问题就解决了。
这是 link,@kjhughes 帮助我找到了解决方案
我有一个 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>
我想根据 sid
标签的值查找 role
标签名称属性。
例如:如果我搜索 abc
,查询必须 return 测试,test1
和 test2
我在下面提到了这个 link 并得到了一半的解决方案。
XMLStarlet Return attribute based on value (Reverse lookup)
我也参考了这个
http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html
但我没有找到任何支持我的要求的示例。
有什么我可以做的吗?
你可以使用的XPath表达式是//role[.//sid = 'abc'
]/@name
,xmlstarlet的命令行是xmled.exe sel -t -v "//role[.//sid = 'abc']/@name" input.xml
(我认为这取决于你的命令行shell你需要使用哪个引号字符包装 XPath 表达式)。
即使@martin-honnen 给出的 XPATH 是正确的,我也没有得到预期的输出。这是由于我的系统中安装了旧版本的 xmlstarlet 1.0.1。当我升级到 1.6.1 时,问题就解决了。
这是 link,@kjhughes 帮助我找到了解决方案