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

时间:2009-12-09 21:42:00

标签: 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)

由于

福斯塔夫

4 个答案:

答案 0 :(得分:2)

我使用(可能因为我写了它; - )xml_grep2,来自App::xml_grep2,它有一个方便的-t选项,返回结果的文本值:

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

应该有效

答案 1 :(得分:0)

您希望根据=分隔字符串,因此请使用splitperldoc -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