215

XPathワンライナーを実行しfoo //element@attribute filename.xmlたりfoo //element@attribute < filename.xml、結果を1行ずつ返すことができるコマンドラインツールを備えた、Ubuntuおよび/またはCentOS用のパッケージはありますか?

私は、ラッパーやその他の適応を必要とせずに、すぐに使用できる、apt-get install fooまたはすぐに使用できるものを探しています。yum install foo

以下に、近いものの例をいくつか示します。

のこぎり。このラッパーを作成すると、上記の方法でラッパーを呼び出すことができます。

#!/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-- NODE --XML::XPathから返されるノイズが多すぎますattribute = "value"

xml_grepfrom 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 を次に示します (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ます。

4

18 に答える 18

302

これらのツールを試す必要があります:

  • xmlstarlet: 編集、選択、変換できます... デフォルトではインストールされません。xpath1
  • xmllint: 多くの場合、デフォルトでlibxml2-utils, xpath1 とともにインストールされます (私のラッパーをチェックして--xpath、非常に古いリリースと改行区切りの出力をオンにします (v < 2.9.9)
  • xpath: perl のモジュールXML::XPathxpath1 経由でインストール
  • xml_grep: perl のモジュールXML::Twigxpath1 経由でインストール (xpath の使用制限あり)
  • xidel: xpath3
  • saxon-lint: 私自身のプロジェクト、@Michael Kay の Saxon-HE Java ライブラリ xpath3 のラッパー

xmllint付属(スイッチlibxml2-utilsでインタラクティブシェルとして使用可能)--shell

xmlstarletですxmlstarlet

xpathperlのモジュールが付属していますXML::Xpath

xml_grepperlのモジュールが付属していますXML::Twig

xidelxidel

saxon-lintSaxonHE 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

.

于 2013-03-17T14:19:46.490 に答える
24

私のXidelを試すこともできます。リポジトリのパッケージには含まれていませんが、Web ページからダウンロードできます (依存関係はありません)。

このタスクの単純な構文は次のとおりです。

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

そして、XPath 2 をサポートするこれらのツールの中でも珍しいものの 1 つです。

于 2013-03-17T15:08:48.880 に答える
16

すでにシステムにインストールされている可能性が非常に高いパッケージの 1 つがpython-lxml. もしそうなら、これは追加のパッケージをインストールせずに可能です:

python -c "from lxml.etree import parse; from sys import stdin; print('\n'.join(parse(stdin).xpath('//element/@attribute')))"
于 2013-03-18T07:05:58.277 に答える
10

maven pom.xml ファイルを照会するための検索で、この質問に出くわしました。ただし、次の制限がありました。

  • クロスプラットフォームで実行する必要があります。
  • 追加のモジュールをインストールすることなく、すべての主要な Linux ディストリビューションに存在する必要があります
  • maven pom.xml ファイルなどの複雑な 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 lib です。

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

これを見つけるきっかけとなったのは、次の記事でした。

于 2014-05-13T17:50:33.010 に答える
10

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
于 2013-03-17T16:28:28.710 に答える
5

xshにも興味があるかもしれません。ドキュメントで好きなことをできるインタラクティブモードを備えています。

open 1.xml ;
ls //element/@id ;
for //p[@class="first"] echo text() ;
于 2013-03-17T14:34:46.000 に答える
2

nokogiri 自体にはコマンド ライン ツールが同梱されていることに注意してくださいgem install nokogiri

このブログ投稿は役に立つかもしれません。

于 2015-12-23T07:29:57.510 に答える
2

XML::XSHXML::XSH2に加えて、 andのようないくつかのgrepユーティリティがあります(これにはではなく が含まれます)。これらは、迅速なワンライナーまたはターゲット のために大規模または多数の XML ファイルで作業する場合に非常に役立ちます。あなたが提供するものよりも少し多くの処理が必要な場合は、スクリプトのアプローチで使用すると特に便利です。App::xml_grep2XML::Twigxml_grepxml_grep2MakefileXML::Twigperl$SHELLxmllint xstlproc

perlアプリケーション名の番号付けスキームは、「2」バージョンが、他のモジュール (またはそれ自体)の新しいバージョンを必要とする可能性がある、本質的に同じツールの新しい/新しいバージョンであることを示しています。

于 2014-03-05T16:37:31.380 に答える