¿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.xml
o foo //element@attribute < filename.xml
y devolver los resultados línea por línea?
Estoy buscando algo que me permita simplemente apt-get install foo
o yum install foo
simplemente 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");
}
xpath
de 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.xml
devuelve ruido similar a xpath
.
xmllint --xpath //element/@attribute filename.xml
vuelve 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
.
xpath
está en STDERR y no en STDOUT.