¿Existe un paquete para Ubuntu y / o CentOS que tenga una herramienta de línea de comandos que pueda ejecutar un XPath de una línea como foo //element@attribute filename.xmlo foo //element@attribute < filename.xmly devolver los resultados línea por línea?
Estoy buscando algo que me permita simplemente apt-get install fooo yum install foosimplemente funcionar de inmediato, sin envoltorios u otra adaptación necesaria.
Aquí hay algunos ejemplos de cosas que se acercan:
Nokogiri. Si escribo este contenedor, podría llamar al contenedor de la manera descrita anteriormente:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath. Funcionaría con este contenedor:
#!/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 devuelve demasiado ruido -- NODE --y attribute = "value".
xml_grep from XML :: Twig no puede manejar expresiones que no devuelven elementos, por lo que no se puede usar para extraer valores de atributos sin más procesamiento.
EDITAR:
echo cat //element/@attribute | xmllint --shell filename.xmldevuelve ruido similar a xpath.
xmllint --xpath //element/@attribute filename.xmlvuelve attribute = "value".
xmllint --xpath 'string(//element/@attribute)' filename.xml devuelve lo que quiero, pero solo para el primer partido.
Para otra solución que casi satisface la pregunta, aquí hay un XSLT que se puede usar para evaluar expresiones XPath arbitrarias (requiere dyn: evaluar el soporte en el procesador 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>
Corre con xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml.
xpathestá en STDERR y no en STDOUT.