Esiste un pacchetto là fuori, per Ubuntu e / o CentOS, che ha uno strumento da riga di comando in grado di eseguire un one-liner XPath come foo //element@attribute filename.xml
o foo //element@attribute < filename.xml
restituire i risultati riga per riga?
Sto cercando qualcosa che mi permettesse di solo apt-get install foo
o yum install foo
e poi solo funziona out-of-the-box, non gli involucri o altri adattamento necessario.
Ecco alcuni esempi di cose che si avvicinano:
Nokogiri. Se scrivo questo wrapper potrei chiamare il wrapper nel modo sopra descritto:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath. Funzionerebbe con questo wrapper:
#!/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
da XML :: XPath restituisce troppo rumore -- NODE --
e attribute = "value"
.
xml_grep
da XML :: Twig non può gestire espressioni che non restituiscono elementi, quindi non può essere utilizzato per estrarre i valori degli attributi senza ulteriore elaborazione.
MODIFICARE:
echo cat //element/@attribute | xmllint --shell filename.xml
restituisce un rumore simile a xpath
.
xmllint --xpath //element/@attribute filename.xml
ritorna attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
restituisce quello che voglio, ma solo per la prima partita.
Per un'altra soluzione che soddisfa quasi la domanda, ecco un XSLT che può essere utilizzato per valutare espressioni XPath arbitrarie (richiede dyn: valuta il supporto nel processore XSLT):
<?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>
Corri con xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.
xpath
da STDERR e non da STDOUT.