Gibt es ein Paket für Ubuntu und / oder CentOS, das über ein Befehlszeilentool verfügt, mit dem ein XPath-Einzeiler wie foo //element@attribute filename.xml
oder ausgeführt foo //element@attribute < filename.xml
und die Ergebnisse zeilenweise zurückgegeben werden können?
Ich bin auf der Suche nach etwas, das es mir ermöglicht, einfach apt-get install foo
oder yum install foo
sofort zu arbeiten, ohne dass Wrapper oder andere Anpassungen erforderlich sind.
Hier sind einige Beispiele für Dinge, die nahe kommen:
Nokogiri. Wenn ich diesen Wrapper schreibe, könnte ich den Wrapper wie oben beschrieben aufrufen:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath. Würde mit diesem Wrapper funktionieren:
#!/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
von XML :: XPath gibt zu viel Rauschen zurück, -- NODE --
und attribute = "value"
.
xml_grep
from XML :: Twig kann keine Ausdrücke verarbeiten, die keine Elemente zurückgeben, und kann daher nicht zum Extrahieren von Attributwerten ohne weitere Verarbeitung verwendet werden.
BEARBEITEN:
echo cat //element/@attribute | xmllint --shell filename.xml
gibt Rauschen ähnlich wie zurück xpath
.
xmllint --xpath //element/@attribute filename.xml
kehrt zurück attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
gibt zurück, was ich will, aber nur für das erste Match.
Für eine andere Lösung, die die Frage fast befriedigt, ist hier ein XSLT, das zum Auswerten beliebiger XPath-Ausdrücke verwendet werden kann (erfordert dyn: evaluiere die Unterstützung im XSLT-Prozessor):
<?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>
Laufen Sie mit xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.
xpath
auf STDERR und nicht auf STDOUT ist.