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
from 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="' '"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
で実行しxsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
ます。
xpath
はSTDOUTではなくSTDERRにあることに注意してください。