我想从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)
由于
福斯塔夫
答案 0 :(得分:2)
我使用(可能因为我写了它; - )xml_grep2
,来自App::xml_grep2,它有一个方便的-t
选项,返回结果的文本值:
virsh dumpxml save | xml_grep2 -t "/domain/devices/disk[@type='file']/source/@file[1]"
应该有效
答案 1 :(得分:0)
您希望根据=
分隔字符串,因此请使用split
(perldoc -f split):
my ($attr, $value) = split /=/, 'file="/var/lib/libvirt/images/save.raw"';
但是,不应按字面解析这些值,而应使用许多XML解析器库,例如XML::XPath。
答案 2 :(得分:0)
/domain/devices/disk[@type='file']/source/@file[1]/text()
答案 3 :(得分:0)
我认为仅返回值是正常行为。也许这是一个错误?我像Tomalak建议的那样尝试/text()
并且它什么也没有返回(至少使用这个工具)
您现在可以在另一个命令sed
中输出输出以获得所需的结果:
... | sed -r 's/.*?"(.*)"/\1/'
修改强>
显然,perl脚本使用XML::XPath
并仅使用find
作为返回NodeSet对象的查询。但是脚本也没有使用findvalue
。也许你可以用脚本来摆弄一下。仅将find
替换为findvalue
仅提供stdout上的值,还会显示stderr上的错误消息。
图书馆的文档:https://metacpan.org/pod/XML::XPath