xml – 如何从shell执行XPath one-liners?
有一个包在那里,对于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。
你应该尝试这些工具:
> xmlstarlet 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 > xmlstarlet page (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |