Existe-t-il un package, pour Ubuntu et / ou CentOS, qui dispose d'un outil de ligne de commande capable d'exécuter un XPath one-liner comme foo //element@attribute filename.xml
or foo //element@attribute < filename.xml
et de renvoyer les résultats ligne par ligne?
Je suis à la recherche de quelque chose qui me permettrait juste apt-get install foo
ou yum install foo
et puis juste de travailler hors de la boîte, aucun emballage ou autre adaptation nécessaire.
Voici quelques exemples de choses qui se 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. Travaillerait 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
from XML :: Twig ne peut pas gérer les expressions qui ne renvoient pas d'éléments, et ne peut donc pas être utilisée pour extraire des valeurs d'attribut sans traitement supplémentaire.
ÉDITER:
echo cat //element/@attribute | xmllint --shell filename.xml
renvoie un bruit similaire à xpath
.
xmllint --xpath //element/@attribute filename.xml
revient attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
renvoie ce que je veux, mais uniquement pour le premier match.
Pour une autre solution satisfaisant presque la question, voici un XSLT qui peut être utilisé pour évaluer des expressions XPath arbitraires (nécessite dyn: evaluer le support 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>
Courez avec xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.