Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xmlstarlet XPath表达式选择单个结果而不是多个结果_Xml_Linux_Bash_Xpath_Xmlstarlet - Fatal编程技术网

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

xmlstarlet XPath表达式选择单个结果而不是多个结果,xml,linux,bash,xpath,xmlstarlet,Xml,Linux,Bash,Xpath,Xmlstarlet,我有一个XML文件,其结构如下: <?xml version="1.0" encoding="UTF-8"?> <hudson> <authorizationStrategy> <roleMap type="globalRoles"> <role name="Employees"> <assignedSIDs>

我有一个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>
但它只给了我“雇员”


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

若您并没有绑定到xmlstarlet,请尝试使用xmllint,否则如下所示的xpath调整可能会有所帮助

$ xmllint --xpath '//role//sid/../../@name' roles.xml
 name="Employees" name="Others"
本例中的xml文件如下所示

<?xml version="1.0" ?>
<hudson>
  <authorizationStrategy>
    <roleMap>
      <role name="Employees">
        <assignedSIDs>
          <sid>abc</sid>
          <sid>bcd</sid>
        </assignedSIDs>
      </role>
      <role name="Others">
        <assignedSIDs>
          <sid>abc</sid>
          <sid>zxc</sid>
        </assignedSIDs>
      </role>
    </roleMap>
  </authorizationStrategy>
</hudson>

abc
卡介苗
abc
zxc

简而言之,您可以通过使用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
>
c:\gd\usr\kjh\proj\try\xml
>cat test.xml
abc
卡介苗
abc
zxc
abc
ghi
abc
c:\gd\usr\kjh\proj\try\xml
>xmlstarlet sel-t-v”//role[.//sid='abc']/@name“test.xml
员工
测试1
测试2
测试3
c:\gd\usr\kjh\proj\try\xml
>xmlstarlet——版本
1.5.0
根据libxml2.9.1编译,链接到20901
根据libxslt 1.1.28编译,与10128链接
c:\gd\usr\kjh\proj\try\xml
>systeminfo | findstr/B/C:“操作系统名称”/C:“操作系统版本”
操作系统名称:Microsoft Windows 7 Professional
操作系统版本: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的最新版本解决了问题。

hi@emil,谢谢您的回答。很抱歉这么说,但我必须只使用xmlstarlet开发一个脚本。无论如何,为了自我开发,我肯定也会尝试你的答案。嗨@kjhughes,我的脚本和test.xml文件在同一个文件夹中。我正在通过更改我的PWD(当前工作目录)从该位置运行脚本。很抱歉,但我在指挥部promt得到的答案仍然是“员工”,而不是tes1 TEST2感谢您提供详细的成绩单@kjhuges。从某种意义上说,我的困惑已经消除了。我的系统运行的是xmlstarlet的1.0.1版本。你认为,这是我没有达到预期输出的主要原因吗?我会升级,如果不可行,搜索更新日志,看看是否有任何相关的更改。祝你好运。嘿@kjhuges,我升级了版本,猜猜看,它成功了!!我很高兴。谢谢你的意见。:)基本上与后面的xmlstarlet版本相同,后者的问题相当于
-m XPATH-v。n自动执行。
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
>