Apakah ada paket di luar sana, untuk Ubuntu dan / atau CentOS, yang memiliki alat baris perintah yang dapat menjalankan XPath one-liner seperti foo //element@attribute filename.xml
atau foo //element@attribute < filename.xml
dan mengembalikan hasil baris demi baris?
Saya mencari sesuatu yang akan memungkinkan saya untuk hanya apt-get install foo
atau yum install foo
dan kemudian hanya bekerja di luar kotak, tidak ada pembungkus atau adaptasi lain yang diperlukan.
Berikut adalah beberapa contoh hal yang mendekati:
Nokogiri. Jika saya menulis bungkus ini saya bisa memanggil bungkusnya dengan cara yang dijelaskan di atas:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath. Akan bekerja dengan bungkus ini:
#!/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
dari XML :: XPath mengembalikan terlalu banyak noise, -- NODE --
dan attribute = "value"
.
xml_grep
dari XML :: Twig tidak dapat menangani ekspresi yang tidak mengembalikan elemen, jadi tidak dapat digunakan untuk mengekstrak nilai atribut tanpa diproses lebih lanjut.
EDIT:
echo cat //element/@attribute | xmllint --shell filename.xml
mengembalikan noise yang mirip dengan xpath
.
xmllint --xpath //element/@attribute filename.xml
kembali attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
mengembalikan apa yang saya inginkan, tetapi hanya untuk pertandingan pertama.
Untuk solusi lain yang hampir memuaskan pertanyaan, berikut adalah XSLT yang dapat digunakan untuk mengevaluasi ekspresi XPath yang berubah-ubah (memerlukan dyn: evaluasi dukungan dalam prosesor 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>
Jalankan dengan xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.
xpath
berada pada STDERR dan bukan STDOUT.