xmlstarlet XPath表达式选择单个结果而不是多个结果
我有一个XML文件,其结构如下: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 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
>