Xml 使用Linux命令xpath选择值(来自Perl)

Xml 使用Linux命令xpath选择值(来自Perl),xml,perl,xpath,Xml,Perl,Xpath,我想从XML树中获取一个属性。因此,我使用libxml-xpath-perl包中的命令xpath。我想出了这个命令: virsh dumpxml save | xpath -e "/domain/devices/disk[@type='file']/source/@file[1]" 这给了我 file="/var/lib/libvirt/images/save.raw" 如何仅选择值?(/var/lib/libvirt/images/save.raw) 谢谢 falstaff如果要根据=分

我想从XML树中获取一个属性。因此,我使用libxml-xpath-perl包中的命令xpath。我想出了这个命令:

virsh dumpxml save | xpath -e "/domain/devices/disk[@type='file']/source/@file[1]"
这给了我

 file="/var/lib/libvirt/images/save.raw"
如何仅选择值?(/var/lib/libvirt/images/save.raw)

谢谢


falstaff

如果要根据
=
分隔字符串,请使用
拆分
():


但是,您不应该逐字解析这些值,而应该使用许多XML解析器库,例如。

我认为只返回值是正常行为。也许是虫子?我尝试了Tomalak建议的
/text()
,但它没有返回任何内容(至少使用此工具)。
现在,您可以通过另一个命令(如
sed
)对输出进行管道传输,以获得所需的结果:

... | sed -r 's/.*?"(.*)"/\1/'
编辑:
显然,perl脚本使用了
XML::XPath
,并且只使用
find
作为返回NodeSet对象的查询。但是还有脚本不使用的
findvalue
。也许你可以把剧本弄得乱七八糟。只有将
find
替换为
findvalue
时,才会给出stdout上的值,同时也会给出stderr上的错误消息。
库的文档:

我使用(可能是因为我写的;--)
xml\u grep2
,from,它有一个方便的
-t
选项,返回结果的文本值:

virsh dumpxml save | xml_grep2 -t "/domain/devices/disk[@type='file']/source/@file[1]"

应该可以工作

这给了我:$virsh dumpxml save 2>/dev/null | xpath-e”/domain/devices/disk[@type='file']/source/@file[1]/text()“在stdinHm中找不到节点,显然无法处理/显示裸文本节点。不可否认,这只是我的猜测。这是我现在在bashscript中使用的解决方法,通过使用cut-d=-f2随意拆分它,但我想为它使用xpath函数,类似于$virsh dumpxml save 2>/dev/null | xpath-e“value(/domain/devices/disk[@type='file']/source/@file[1])……是的,这有点像我现在使用的。。。我只是想用xpath的方式来做。。。切割-d=-f2
... | sed -r 's/.*?"(.*)"/\1/'
virsh dumpxml save | xml_grep2 -t "/domain/devices/disk[@type='file']/source/@file[1]"