是否有一个针对Ubuntu和/或CentOS的包,它有一个命令行工具,可以执行像foo //element@attribute filename.xml或foo //element@attribute < filename.xml这样的XPath一行程序,并逐行返回结果?

我正在寻找一些东西,这将允许我只是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从XML:: xpath返回太多噪音,——NODE——和attribute = "value"。

来自XML::Twig的xml_grep不能处理不返回元素的表达式,因此不能在没有进一步处理的情况下用于提取属性值。

编辑:

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(需要XSLT处理器中的dyn:evaluate支持):

<?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。


当前回答

很抱歉又加入了争论。我尝试了这篇文章中的所有工具,但没有一个能满足我的需求,所以我自己编写了一个。你可以在这里找到它:https://github.com/charmparticle/xpe

它已经上传到pypi,所以你可以很容易地用pip3安装它,就像这样:

sudo pip3 install xpe

安装后,您可以使用它对各种输入运行xpath表达式,其灵活性与在selenium或javascript中使用xpath所获得的灵活性相同。你可以用xpaths来对抗HTML。

其他回答

我对用于HTML XPath查询的Python一行程序不太满意,所以我自己编写了一行程序。假设您安装了python-lxml包或运行pip install——user lxml:

function htmlxpath() { python -c 'for x in __import__("lxml.html").html.fromstring(__import__("sys").stdin.read()).xpath(__import__("sys").argv[1]): print(x)' $1 }

一旦你有了它,你就可以像下面这个例子中那样使用它:

> curl -s https://slashdot.org | htmlxpath '//title/text()'
Slashdot: News for nerds, stuff that matters

系统上很可能已经安装了python-lxml包。如果是这样,这是可能的,无需安装任何额外的包:

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

你应该试试这些工具:

xmlstarlet (xmlstarlet page) : can edit, select, transform... Not installed by default, xpath1 xmllint (man xmllint): often installed by default with libxml2-utils, xpath1 (check my wrapper to have --xpath switch on very old releases and newlines delimited output (v < 2.9.9)). Can be used as interactive shell with the --shell switch. xpath : installed via perl's module XML::Xpath, xpath1 xml_grep : installed via perl's module XML::Twig, xpath1 (limited xpath usage) xidel (xidel): xpath3 saxon-lint (saxon-lint): my own project, wrapper over @Michael Kay's Saxon-HE Java library, xpath3: using SaxonHE 9.6 ,XPath 3.x (+retro compatibility)

例子:

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

除了XML::XSH和XML::XSH2之外,还有一些类似grep的实用程序,如App::xml_grep2和XML::Twig(包括xml_grep而不是xml_grep2)。在处理大型或大量XML文件以实现快速联机程序或Makefile目标时,这些功能非常有用。当您想要比$SHELL和xmllint xstlproc提供更多的处理时,XML::Twig特别适合用于perl脚本方法。

应用程序名称中的编号方案表明“2”版本是本质上相同工具的更新/更新版本,可能需要其他模块(或perl本身)的更新版本。

安装BaseX数据库,然后像这样使用它的“独立命令行模式”:

basex -i - //element@attribute < 文件名.xml

or

{pos(24)}金马资

查询语言实际上是XQuery(3.0),而不是XPath,但由于XQuery是XPath的超集,因此可以毫不注意地使用XPath查询。