首页 > 解决方案 > 使用 XPath string() 从 bash 脚本中的 XML 获取属性值

问题描述

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

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

<root>
    <level1>
        <somechild foo="bar" />
    </level1>
</root

我想barsomechilds 属性中获取值foo。但是,当我查询

FOO=$(xpath -e '/root/level1/somechild/@foo' $XMLFILE)"

在我的 bash 脚本中,它返回foo="bar"而不是bar.

我已经研究过这个问题,发现我必须用 string() 做一些事情,但我只是无法弄清楚正确的语法是什么。

我已经在各个地方尝试过 string() 函数,但到目前为止我最接近成功的是

FOO="$(xpath -e 'string(/root/level1/somechild/@foo)' $XMLFILE)"

在这种情况下echo $FOO给了我

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

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

我该如何正确使用它?

标签: xmlbashxpathubuntu-18.04xmlstarlet

解决方案


使用有效的 XML:

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

或者

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

输出:

酒吧

推荐阅读