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.xmlo foo //element@attribute < filename.xmlrestituire i risultati riga per riga?
Sto cercando qualcosa che mi permettesse di solo apt-get install fooo yum install fooe 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");
}
xpathda 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.xmlrestituisce un rumore simile a xpath.
xmllint --xpath //element/@attribute filename.xmlritorna 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.
xpathda STDERR e non da STDOUT.