Есть ли там пакет для Ubuntu и/или CentOS, у которого есть инструмент командной строки, который может выполнять однострочный интерфейс XPath, например foo //[email protected] filename.xml
или foo //[email protected] < filename.xml
, и возвращать результаты по строкам?
Я ищу что-то, что позволило бы мне просто apt-get install foo
или yum install foo
, а затем просто работать из коробки, без оберток или другой адаптации.
Вот несколько примеров близких вещей:
Nokogiri. Если я напишу эту оболочку, я мог бы вызвать оболочку описанным выше способом:
#!/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 не может обрабатывать выражения, которые не возвращают элементы, поэтому их нельзя использовать для извлечения значений атрибутов без дальнейшей обработки.
EDIT:
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
.