1. ホーム
  2. xml

[解決済み】シェルからXPathワンライナーを実行する方法は?

2022-04-08 01:19:06

質問

Ubuntu や CentOS で、以下のような XPath のワンライナーを実行できるコマンドラインツールがあるパッケージはありますか? foo //element@attribute filename.xml または foo //element@attribute < filename.xml で、その結果を一行ずつ返す?

私は、何か、単に 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 をXML::XPathから読み込むと、ノイズが多すぎる。 -- NODE --attribute = "value" .

xml_grep は要素を返さない式を扱うことができないため、さらなる処理なしに属性値を抽出するために使用することはできません。

EDIT

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 .

解決方法は?

これらのツールを試してみてください。

  • xmlstarlet : 編集、選択、変換...が可能です。デフォルトではインストールされていない、xpath1
  • xmllint と共にデフォルトでインストールされることが多い。 libxml2-utils , xpath1 (私の ラッパー を持つようにします。 --xpath 非常に古いリリースや改行で区切られた出力に対応 (v < 2.9.9)
  • xpath : perl のモジュール経由でインストールされます。 XML::XPath , xpath1
  • xml_grep : perl のモジュール経由でインストールされます。 XML::Twig , xpath1 (xpathの使用は制限されています)
  • xidel : xpath3
  • saxon-lint マイケル・ケイの Saxon-HE Java ライブラリ、xpath3 のラッパーです。

xmllint が付属しています。 libxml2-utils (を使えば、インタラクティブなシェルとして使うことができます。 --shell スイッチ)

xmlstarletxmlstarlet .

xpath はperlのモジュールに付属しています。 XML::Xpath

xml_grep は、perl のモジュールに付属しています。 XML::Twig

xidelxidel

saxon-lint を使って 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

.