是否有一个针对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。


当前回答

在我搜索maven pom.xml文件时,我遇到了这个问题。然而,我有以下限制:

必须跨平台运行。 必须存在于所有主要的Linux发行版中,而没有任何额外的模块安装 必须处理复杂的xml文件,如maven pom.xml文件 简单的语法

我尝试了上面的许多方法,但都没有成功:

python lxml。Etree不是标准python发行版的一部分 xml。Etree是,但不能很好地处理复杂的maven pom.xml文件,挖得不够深 python xml。由于未知原因,Etree不处理maven pom.xml文件 Xmllint也不能工作,核心转储通常在ubuntu 12.04 " Xmllint: using libxml version 20708"

我所遇到的解决方案是稳定的,简短的,可以在许多平台上工作,并且是成熟的,是ruby中内置的rexml库:

ruby -r rexml/document -e 'include REXML; 
     puts XPath.first(Document.new($stdin), "/project/version/text()")' < pom.xml

启发我找到这篇文章的是下面的文章:

Ruby/XML, XSLT和XPath教程 IBM: Ruby on Rails和XML

其他回答

值得一提的是,nokogiri本身带有一个命令行工具,应该与gem install nokogiri一起安装。

你可能会发现这篇博客文章很有用。

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

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

or

{pos(24)}金马资

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

您可能还对xsh感兴趣。它的特点是一个交互模式,你可以做任何你喜欢的文档:

open 1.xml ;
ls //element/@id ;
for //p[@class="first"] echo text() ;

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

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

Saxon不仅将对XPath 2.0这样做,还将对XQuery 1.0和(商业版本)3.0这样做。它不是一个Linux包,而是一个jar文件。语法(您可以轻松地将其包装在一个简单的脚本中)

java net.sf.saxon.Query -s:source.xml -qs://element/attribute

2020年更新

Saxon 10.0包括Gizmo工具,它可以从命令行以交互方式或批处理方式使用。例如

java net.sf.saxon.Gizmo -s:source.xml
/>show //element/@attribute
/>quit