为了账号安全,请及时绑定邮箱和手机立即绑定

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

如何从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 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="'&#10;'"/>     </xsl:for-each>    </xsl:template></xsl:stylesheet>运行xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml。
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

你应该尝试这些工具:

  • xmlstarlet :可以编辑,选择,转换...默认情况下不安装,xpath1

  • xmllint:经常默认使用libxml2xpath1 安装(检查我的包装器是否有换行符分隔输出

  • xpath:通过perl的模块XML::XPathxpath1 安装

  • xml_grep:通过perl的模块安装XML::Twig,xpath1(有限的xpath用法)

  • xidel:xpath3

  • saxon-lint :我自己的项目,包装在@Michael Kay的Saxon-HE Java库xpath3上

xmllint附带libxml2-utils(可用作--shell交换机的交互式外壳)

xmlstarletxmlstarlet

xpath 附带perl的模块 XML::Xpath

xml_grep 附带perl的模块 XML::Twig

xidel 是 xidel

saxon-lint使用SaxonHE 9.6XPath 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


查看完整回答
反对 回复 2019-08-15
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

你也可以尝试我的Xidel。它不在存储库的包中,但您可以从网页下载它(它没有依赖项)。

它具有此任务的简单语法:

xidel filename.xml -e '//element/@attribute'

它是支持XPath 2的这些工具中罕见的一种。


查看完整回答
反对 回复 2019-08-15
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

一个很可能已安装在系统上的软件包已经存在python-lxml。如果是这样,可以在不安装任何额外包的情况下实现:

python -c "from lxml.etree import parse; from sys import stdin; print '\n'.join(parse(stdin).xpath('//element/@attribute'))"


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 1182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信