如何从shell执行XPath单行程?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

对于Ubuntu和/或CentOS,是否有一个包含命令行工具的软件包,可以执行一行XPath,foo //element@attribute filename.xml或者foo //element@attribute < filename.xml一行一行地返回结果?

我在寻找的东西,让我只apt-get install fooyum install foo再只是工作外的开箱,没有包装或其他适应必要的。

以下是一些近在咫尺的例子:

引入nokogiri。如果我写这个包装器,我可以按照上面描述的方式调用包装器:

#!/usr/bin/ruby

require 'nokogiri'

Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
  puts row
end

XML :: XPath的。将使用这个包装:

#!/usr/bin/perl

use strict;
use warnings;
use XML::XPath;

my $root = XML::XPath->new(ioref => 'STDIN');
for my $node ($root->find($ARGV[0])->get_nodelist) {
  print($node->getData, "\n");
}

xpath来自XML :: XPath的回声太多了,-- NODE --而且attribute = "value"

xml_grep 来自XML :: Twig无法处理不返回元素的表达式,因此不能用于提取属性值而无需进一步处理。

提问于
用户回答回答于

你应该尝试这些工具:

  • xmlstarlet
  • xmllint
  • saxon-lint (自己的项目)

xmllint带有libxml2-utils(可被用作交互式壳与--shell开关)xmlstarletxmlstarlet

saxon-lint使用SaxonHE 9.6是运行的唯一的XPath 3.x的(+复古兼容性),其他的人运行的XPath 1.x的。

例如:

xmllint --xpath '//element/@attribute' file.xml
xmlstarlet sel -t -v "//element/@attribute" file.xml
saxon-lint --xpath '//element/@attribute' file.xml
用户回答回答于

一个很有可能安装在系统上的软件包已经是python-lxml。如果是这样,这可能没有安装任何额外的软件包:

python -c "from lxml.etree import parse; from sys import stdin; print '\n'.join(parse(stdin).xpath('//element/@attribute'))"

扫码关注云+社区