Existe-t-il un paquetage, pour Ubuntu et/ou CentOS, qui dispose d'un outil en ligne de commande capable d'exécuter une ligne de commande XPath du type foo //element@attribute filename.xml
o foo //element@attribute < filename.xml
et renvoyer les résultats ligne par ligne ?
Je cherche quelque chose qui me permettrait de juste apt-get install foo
o yum install foo
et fonctionne alors tout simplement, sans wrapper ou autre adaptation nécessaire.
Voici quelques exemples de choses qui s'en rapprochent :
Nokogiri. Si j'écris ce wrapper, je pourrais appeler le wrapper de la manière décrite ci-dessus :
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML::XPath. Cela fonctionnerait avec ce 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
de XML::XPath renvoie trop de bruit, -- NODE --
et attribute = "value"
.
xml_grep
de XML::Twig ne peut pas gérer les expressions qui ne renvoient pas d'éléments, et ne peut donc pas être utilisé pour extraire les valeurs des attributs sans traitement supplémentaire.
EDITAR:
echo cat //element/@attribute | xmllint --shell filename.xml
renvoie un bruit similaire à xpath
.
xmllint --xpath //element/@attribute filename.xml
renvoie à attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
retourne ce que je veux, mais seulement pour le premier match.
Pour une autre solution répondant presque à la question, voici un XSLT qui peut être utilisé pour évaluer des expressions XPath arbitraires (nécessite le support de dyn:evaluate dans le processeur 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>
Exécuter avec xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.
0 votes
+1 pour la bonne question et pour le brainstorming sur la recherche d'un moyen simple et fiable d'imprimer plusieurs résultats, chacun sur une nouvelle ligne.
1 votes
Notez que le "bruit" de
xpath
est sur STDERR et non STDOUT.0 votes
@miken32 Non. Je voulais seulement la valeur pour la sortie. hastebin.com/ekarexumeg.bash