有一个包在那里,对于Ubuntu和/或CentOS,有一个命令行工具,可以执行XPath一行如foo // element @ attribute filename.xml或foo // element @ attribute< filename.xml并逐行返回结果? 我正在寻找的东西,将允许我只是apt-get安装foo或yum安装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 from XML :: XPath返回太多的噪音, – NODE – 和attribute =“value”。
xml_grep from 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表达式(需要dyn:在XSLT处理器中评估支持)的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模式运行// element / @ attribute –stringparam value。 arbitrary-xpath.xslt filename.xml。
你应该尝试这些工具:
原文链接:https://www.f2er.com/xml/294165.html> xmlstarlet
> xmllint
> saxon-lint
xmllint自带libxml2-utils(可以作为交互式shell使用–shell开关)xmlstarlet是xmlstarlet。
萨克森 – 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