【问题标题】:Select value with Linux command xpath (from Perl)使用 Linux 命令 xpath(来自 Perl)选择值
【发布时间】:2015-02-11 06:36:40
【问题描述】:

我想从 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)

谢谢

福斯塔夫

【问题讨论】:

    标签: xml perl xpath


    【解决方案1】:

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

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

    应该有效

    【讨论】:

      【解决方案2】:

      你想根据=分隔字符串,所以使用splitperldoc -f split):

      my ($attr, $value) = split /=/, 'file="/var/lib/libvirt/images/save.raw"';
      

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

      【讨论】:

      • 这是我现在在我的 bashscript 中使用的解决方法,通过使用 cut -d = -f 2 将其拆分,但我想为其使用 xpath 函数,例如 $ virsh dumpxml save 2> /dev/null | xpath -e "value(/domain/devices/disk[@type='file']/source/@file[1])" ...
      【解决方案3】:
      /domain/devices/disk[@type='file']/source/@file[1]/text()
      

      【讨论】:

      • 这给了我:$ virsh dumpxml save 2>/dev/null | xpath -e "/domain/devices/disk[@type='file']/source/@file[1]/text()" 在标准输入中找不到节点
      • 嗯,显然无法处理/显示裸文本节点。诚然,这只是我的猜测。
      【解决方案4】:

      我认为只返回值是正常行为。也许这是一个错误?我尝试了/text(),就像 Tomalak 建议的那样,它什么也没返回(至少使用这个工具)。
      您现在可以在另一个命令(例如 sed)中通过管道输出输出以获得所需的结果:

      ... | sed -r 's/.*?"(.*)"/\1/'
      

      编辑:
      显然 perl 脚本使用 XML::XPath 并且仅使用 find 来进行返回 NodeSet 对象的查询。但也有脚本不使用的findvalue。也许你可以稍微摆弄一下脚本。仅将 find 替换为 findvalue 只会在 stdout 上给出值,但也会在 stderr 上给出错误消息。
      图书馆文档:https://metacpan.org/pod/XML::XPath

      【讨论】:

      • 是的,它有点像我现在使用的......我只是想以 xpath 的方式来做...... cut -d = -f 2
      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多