使用XPath字符串()从bash脚本中的XML获取属性值

使用XPath字符串()从bash脚本中的XML获取属性值,xml,bash,xpath,ubuntu-18.04,xmlstarlet,Xml,Bash,Xpath,Ubuntu 18.04,Xmlstarlet,序言: 这不是重复的,因为所有其他主题都没有回答我的特定问题。 我在徐本图18.04上 使用libxml xpath perl 1.42(如果有必要的话) 问题: 我有一个XML,可以这样说: <root> <level1> <somechild foo="bar" /> </level1> </root 在我的bash脚本中,它返回foo=“bar”,而不是bar 我已经研究过这个问题,发现我必须用stri

序言:
这不是重复的,因为所有其他主题都没有回答我的特定问题。
我在徐本图18.04上
使用libxml xpath perl 1.42(如果有必要的话)

问题:
我有一个XML,可以这样说:

<root>
    <level1>
        <somechild foo="bar" />
    </level1>
</root
在我的bash脚本中,它返回
foo=“bar”
,而不是
bar

我已经研究过这个问题,发现我必须用string()做一些事情,但我就是不知道正确的语法是什么

我在不同的地方尝试过string()函数,但迄今为止最接近成功的是

FOO="$(xpath -e 'string(/root/level1/somechild/@foo)' $XMLFILE)"
在这种情况下,
echo$FOO
给了我

查询未返回节点集。值:bar

仍然不是我想要的,但至少没有错误,并且该值被识别为
bar

如何正确使用此选项?

和有效的XML:

xpath -e 'string(//root/level1/somechild/@foo)' file.xml 2>/dev/null 

输出:

bar 酒吧
好的,我发现xpath的行为很奇怪,但是将输出2发送到/dev/null解决了这个问题。同样值得注意的是,在命令行
xpath-q…
中,没有错误消息。但是,在我的bash脚本
xpath-q…
中,仍然会出现错误。不管怎样,我将使用
2>/dev/null
感谢XPath表达式正在返回属性节点,并且属性节点在输出中的显示方式取决于调用的应用程序。如果需要字符串值,则string()函数会提供该值,但某些应用程序只能处理返回节点的XPath表达式。
xmlstarlet select --text --template --copy-of 'string(//root/level1/somechild/@foo)' file.xml
xmlstarlet select --text --template --match '//root/level1/somechild' --value-of '@foo' file.xml
bar