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.xmlor foo //element@attribute < filename.xmlet de renvoyer les résultats ligne par ligne?
Je suis à la recherche de quelque chose qui me permettrait juste apt-get install fooou yum install fooet 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");
}
xpathde 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.xmlrenvoie un bruit similaire à xpath.
xmllint --xpath //element/@attribute filename.xmlrevient 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.