[解決済み】シェルからXPathワンライナーを実行する方法は?
質問
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="' '"/>
</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
スイッチ)
xmlstarlet
は
xmlstarlet
.
xpath
はperlのモジュールに付属しています。
XML::Xpath
xml_grep
は、perl のモジュールに付属しています。
XML::Twig
xidel
は
xidel
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
.
関連
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] テキストファイルから、特定の文字列を含むすべての行を削除するにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Git上でシェルコマンドを実行する際に使用するSSH-keyの秘密鍵を指定する方法は?
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] シェルスクリプトで部分文字列を別の文字列に置き換える
-
[解決済み] 整数の合計を1行に1つずつ表示するシェルコマンド?
-
[解決済み】XML スキーマ(XSD)検証ツール?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XSLTでif-else文を実装する方法とは?
-
[解決済み] XML: 後続のセクションでコンテンツが許可されていない
-
[解決済み] i:nil="true "とはどういう意味ですか?
-
[解決済み] Powershell - XMLをCSVに変換する
-
[解決済み] grepを使ってxmlタグの中の情報を見つけるには?
-
[解決済み] Ruby XML to JSON Converter?
-
[解決済み] XPathにおける要素の数
-
末尾のセクションにコンテンツを入れることはできません。
-
[解決済み】googleプロトコルバッファ vs json vs XML【終了しました
-
[解決済み】xsd:includeとxsd:importの違いは何ですか?