猿问

如何从shell执行XPath单行程序?

如何从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="'&#10;'"/>
    </xsl:for-each> 
  </xsl:template></xsl:stylesheet>

运行xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml


一只萌萌小番薯
浏览 1228回答 3
3回答

泛舟湖上清波郎朗

你应该尝试这些工具:xmlstarlet&nbsp;:可以编辑,选择,转换...默认情况下不安装,xpath1xmllint:经常默认使用libxml2xpath1&nbsp;安装(检查我的包装器是否有换行符分隔输出xpath:通过perl的模块XML::XPathxpath1&nbsp;安装xml_grep:通过perl的模块安装XML::Twig,xpath1(有限的xpath用法)xidel:xpath3saxon-lint&nbsp;:我自己的项目,包装在@Michael Kay的Saxon-HE Java库xpath3上xmllint附带libxml2-utils(可用作--shell交换机的交互式外壳)xmlstarlet是xmlstarlet。xpath&nbsp;附带perl的模块&nbsp;XML::Xpathxml_grep&nbsp;附带perl的模块&nbsp;XML::Twigxidel&nbsp;是&nbsp;xidelsaxon-lint使用SaxonHE 9.6,XPath 3.x(+复古兼容性)例如:xmllint&nbsp;--xpath&nbsp;'//element/@attribute'&nbsp;file.xml xmlstarlet&nbsp;sel&nbsp;-t&nbsp;-v&nbsp;"//element/@attribute"&nbsp;file.xml xpath&nbsp;-q&nbsp;-e&nbsp;'//element/@attribute'&nbsp;file.xml xidel&nbsp;-se&nbsp;'//element/@attribute'&nbsp;file.xml saxon-lint&nbsp;--xpath&nbsp;'//element/@attribute'&nbsp;file.xmlxmlstarlet页面男人xmllintxpath页面xml_grepxidel萨克森 - 皮棉

收到一只叮咚

你也可以尝试我的Xidel。它不在存储库的包中,但您可以从网页下载它(它没有依赖项)。它具有此任务的简单语法:xidel&nbsp;filename.xml&nbsp;-e&nbsp;'//element/@attribute'它是支持XPath 2的这些工具中罕见的一种。

慕莱坞森

一个很可能已安装在系统上的软件包已经存在python-lxml。如果是这样,可以在不安装任何额外包的情况下实现:python&nbsp;-c&nbsp;"from&nbsp;lxml.etree&nbsp;import&nbsp;parse;&nbsp;from&nbsp;sys&nbsp;import&nbsp;stdin;&nbsp;print&nbsp;'\n'.join(parse(stdin).xpath('//element/@attribute'))"
随时随地看视频慕课网APP
我要回答