有没有适用于Ubuntu和/或CentOS的软件包,其中包含一个命令行工具,可以执行XPath one-liner,例如foo //element@attribute filename.xml
或foo //element@attribute < filename.xml
并逐行返回结果?
我正在寻找一些东西,它可以让我只需通过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");
}
xpath
函数在XML::XPath中返回太多的噪音,包括-- NODE --
和attribute = "value"
。
xml_grep
函数在XML::Twig中不能处理不返回元素的表达式,因此无法仅通过进一步处理提取属性值。
编辑:
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
命令运行。
xpath
产生的“噪音”在标准错误输出(STDERR)而不是标准输出(STDOUT)。 - miken32