首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从shell执行XPath一行程序?

如何从shell执行XPath一行程序?
EN

Stack Overflow用户
提问于 2013-03-17 22:16:47
回答 14查看 145.3K关注 0票数 214

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

我正在寻找的东西,将允许我只使用apt-get install fooyum install foo,然后只是开箱即用,没有包装器或其他必要的适应。

下面是一些很接近的例子:

诺科吉里。如果我写这个包装器,我可以用上面描述的方式调用包装器:

代码语言:javascript
复制
#!/usr/bin/ruby

require 'nokogiri'

Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
  puts row
end

XML::XPath。将与此包装器一起工作:

代码语言:javascript
复制
#!/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中的xpath返回了太多的noise、-- 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支持):

代码语言:javascript
复制
<?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运行。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15461737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档