如何从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 rowendXML :: 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。
3 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
你应该尝试这些工具:
xmlstarlet
:可以编辑,选择,转换...默认情况下不安装,xpath1xmllint
:经常默认使用libxml2
xpath1 安装(检查我的包装器是否有换行符分隔输出xpath
:通过perl的模块XML::XPath
xpath1 安装xml_grep
:通过perl的模块安装XML::Twig
,xpath1(有限的xpath用法)xidel
:xpath3saxon-lint
:我自己的项目,包装在@Michael Kay的Saxon-HE Java库xpath3上
xmllint
附带libxml2-utils
(可用作--shell
交换机的交互式外壳)
xmlstarlet
是xmlstarlet
。
xpath
附带perl的模块 XML::Xpath
xml_grep
附带perl的模块 XML::Twig
xidel
是 xidel
saxon-lint
使用SaxonHE 9.6,XPath 3.x(+复古兼容性)
例如:
xmllint --xpath '//element/@attribute' file.xml xmlstarlet sel -t -v "//element/@attribute" file.xml xpath -q -e '//element/@attribute' file.xml xidel -se '//element/@attribute' file.xml saxon-lint --xpath '//element/@attribute' file.xml
慕莱坞森
TA贡献1810条经验 获得超4个赞
一个很可能已安装在系统上的软件包已经存在python-lxml
。如果是这样,可以在不安装任何额外包的情况下实现:
python -c "from lxml.etree import parse; from sys import stdin; print '\n'.join(parse(stdin).xpath('//element/@attribute'))"
添加回答
举报
0/150
提交
取消