如何从shell执行XPath单行程序?
对于Ubuntu和/或CentOS,是否有一个包,它有一个命令行工具,可以执行XPath单线程,foo //element@attribute filename.xml
或者foo //element@attribute < filename.xml
逐行返回结果?
我正在寻找一些可以让我只是apt-get install foo
或者yum install foo
然后只是开箱即用,没有包装或其他必要的改编的东西。
以下是一些接近的事例:
引入nokogiri。如果我写这个包装器,我可以用上面描述的方式调用包装器:
#!/usr/bin/rubyrequire 'nokogiri'Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row| puts rowend
XML :: XPath的。可以使用这个包装器:
#!/usr/bin/perluse 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
返回我想要的,但仅限于第一场比赛。
对于几乎满足该问题的另一个解决方案,这里有一个可用于评估任意XPath表达式的XSLT(需要dyn:在XSLT处理器中评估支持):
<?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
。
泛舟湖上清波郎朗
收到一只叮咚
慕莱坞森