【发布时间】:2013-03-05 21:34:27
【问题描述】:
是否有适用于 Ubuntu 和/或 CentOS 的软件包,它有一个命令行工具,可以执行像 foo //element@attribute filename.xml 或 foo //element@attribute < filename.xml 这样的 XPath 单行程序并逐行返回结果?
我正在寻找可以让我只使用 apt-get install foo 或 yum 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");
}
来自 XML::XPath 的xpath 返回太多噪音,-- NODE -- 和 attribute = "value"。
来自 XML::Twig 的xml_grep 无法处理不返回元素的表达式,因此不能用于提取属性值而无需进一步处理。
编辑:
echo cat //element/@attribute | xmllint --shell filename.xml 返回类似于xpath 的噪声。
xmllint --xpath //element/@attribute filename.xml 返回attribute = "value"。
xmllint --xpath 'string(//element/@attribute)' filename.xml 返回我想要的,但仅限于第一场比赛。
对于另一个几乎可以满足该问题的解决方案,这里有一个 XSLT,可用于评估任意 XPath 表达式(需要 XSLT 处理器中的 dyn:evaluate 支持):
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn">
<xsl:output omit-xml-declaration="yes" indent="no" method="text"/>
<xsl:template match="/">
<xsl:for-each select="dyn:evaluate($pattern)">
<xsl:value-of select="dyn:evaluate($value)"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml 运行。
【问题讨论】:
-
+1 提出好问题并集思广益,寻找一种简单可靠的方法在换行符上打印多个结果
-
请注意,来自
xpath的“噪音”是在 STDERR 上,而不是在 STDOUT 上。 -
@miken32 不。我只想要输出的值。 hastebin.com/ekarexumeg.bash
标签: xml shell xpath cross-platform