使用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