Чи є там пакет для Ubuntu та / або CentOS, який має інструмент командного рядка, який може виконати однорядний XPath типу foo //element@attribute filename.xml
або foo //element@attribute < filename.xml
повернути результати за рядком?
Я шукав що - то , що дозволить мені просто apt-get install foo
або , yum install foo
а потім просто працює поза коробки, без обгортки або інший адаптації необхідно.
Ось кілька прикладів речей, які наближаються:
Нокогірі. Якщо я напишу цю обгортку, я можу викликати обгортку описаним вище способом:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath. Працює з цією обгорткою:
#!/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
від XML :: XPath повертає занадто багато шуму -- NODE --
та attribute = "value"
.
xml_grep
від XML :: Twig не може обробляти вирази, які не повертають елементи, тому їх не можна використовувати для отримання значень атрибутів без подальшої обробки.
Редагувати:
echo cat //element/@attribute | xmllint --shell filename.xml
повертає шум, подібний до xpath
.
xmllint --xpath //element/@attribute filename.xml
повертає attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
повертає те, що я хочу, але лише за перший матч.
Ще одне рішення, що майже задовольняє питання, ось XSLT, який може бути використаний для оцінки довільних виразів XPath (потрібен dyn: оцінка підтримки в процесорі 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>
Біжи з xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.
xpath
є на STDERR, а не на STDOUT.