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

标签 xml linux bash xpath xmlstarlet

我有一个结构如下的 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,查询必须返回 Employees、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 解决了这个问题。

关于xmlstarlet XPath表达式选择单个结果而不是多个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33079965/

相关文章:

mysql - 所有通过 Bash 排除的 MySQL 表

php - 我如何将此 MySQL 数据转换为此 XML 字符串 (PHP)?

java - 获取 XML 文件的网站 URL JSP-Java

linux - RHEL 5 上面向开发人员的 Websphere Application Server 6.1 控制台安装失败

linux - 汇编语言和打印结果。斐波那契数列

linux - Bash脚本不返回任何东西,使用位置参数

Bash Shell 当前日期减去天数

java - jar.libs.dir 没有被正确覆盖吗?

java - 尝试在 Java 中将完整的 XML 文件读取为字符串

regex - 如何在找到与 sed 的匹配项后仅追加一行?