xmlstarlet XPath表达式选择单个结果而不是多个

我有一个具有如下结构的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<hudson>
    <authorizationStrategy>
        <roleMap type="globalRoles">
            <role name="Employees">
                <assignedSIDs>
                    <sid>abc</sid>
                    <sid>bcd</sid>                      
                </assignedSIDs>
            </role>
        </roleMap>
        <roleMap type="projectRoles">   
            <role name="test1" pattern=".*">
                <assignedSIDs>
                    <sid>abc</sid>
                    <sid>zxc</sid>
                </assignedSIDs>
            </role>
            <role name="test2" pattern=".*">
                <permissions/>
                <assignedSIDs>
                    <sid>abc</sid>
                    <sid>ghi</sid>
                </assignedSIDs>
            </role>
            <role name="test3" pattern=".*">
                <permissions/>
                <assignedSIDs>
                    <sid>abc</sid>
                </assignedSIDs>
            </role>
        </roleMap>
    </authorizationStrategy>
</hudson>

以前,我没有给出问题的整个结构,而在解决方案中得到的xpath,也没有给出我期望的结果(在我的系统上,但给了回答我问题的人),以下链接search tag attribute value based on child node value using XmlStarlet

如该链接中所述,我想根据sid标签的值查找角色标签名称属性.例如:如果我搜索abc,则查询必须返回雇员,test1,test2和test3.

这是我使用的脚本:

xmlstarlet sel -t -v "//role[.//sid = 'abc']/@name" test.xml

但是它只给了我“员工”.

我正在使用LINUX / bash.请告诉我,我在XPATH表达式中缺少什么.

解决方法:

您使用的XPath和xmlstarlet命令,

xmlstarlet sel -t -v "//role[.//sid = 'abc']/@name" test.xml

已经导致返回以下字符串,

Employees
test1
test2
test3

按照要求.

您的XPath是正确的;您的xmlstarlet命令行是正确的.重新检查使用的文件名和运行xmlstarlet的目录.重新检查您在实际上下文中如何使用xmlstarlet命令的结果.在您发布的这种简化表格中,预期结果正是返回的结果.

更新:很抱歉听到您仍然被卡住.我的最后一个想法是发布详细的成绩单,以证明它应该起作用,以便您可以追溯步骤并尝试查看路径可能不同的地方:

c:\gd\usr\kjh\proj\try\xml
> cat test.xml
<?xml version="1.0" encoding="UTF-8"?>
<hudson>
    <authorizationStrategy>
        <roleMap type="globalRoles">
            <role name="Employees">
                <assignedSIDs>
                    <sid>abc</sid>
                    <sid>bcd</sid>
                </assignedSIDs>
            </role>
        </roleMap>
        <roleMap type="projectRoles">
            <role name="test1" pattern=".*">
                <assignedSIDs>
                    <sid>abc</sid>
                    <sid>zxc</sid>
                </assignedSIDs>
            </role>
            <role name="test2" pattern=".*">
                <permissions/>
                <assignedSIDs>
                    <sid>abc</sid>
                    <sid>ghi</sid>
                </assignedSIDs>
            </role>
            <role name="test3" pattern=".*">
                <permissions/>
                <assignedSIDs>
                    <sid>abc</sid>
                </assignedSIDs>
            </role>
        </roleMap>
    </authorizationStrategy>
</hudson>

c:\gd\usr\kjh\proj\try\xml
> xmlstarlet sel -t -v "//role[.//sid = 'abc']/@name" test.xml
Employees
test1
test2
test3
c:\gd\usr\kjh\proj\try\xml
> xmlstarlet --version
1.5.0
compiled against libxml2 2.9.1, linked with 20901
compiled against libxslt 1.1.28, linked with 10128

c:\gd\usr\kjh\proj\try\xml
> systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
OS Name:                   Microsoft Windows 7 Professional
OS Version:                6.1.7601 Service Pack 1 Build 7601
c:\gd\usr\kjh\proj\try\xml
>

最终更新:

OP注意到他的xmlstarlet版本(v1.0.1)比我在上述抄本(xmlstarlet v1.5.0)中使用的版本要大得多.升级到最新版本的xmlstarlet可以解决此问题.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...