Có một gói ngoài đó, cho Ubuntu và / hoặc CentOS, có một công cụ dòng lệnh có thể thực thi một XPath như một lớp lót foo //element@attribute filename.xml
hoặc foo //element@attribute < filename.xml
trả về dòng kết quả theo từng dòng không?
Tôi đang tìm kiếm thứ gì đó cho phép tôi chỉ apt-get install foo
hoặc yum install foo
sau đó chỉ hoạt động ngoài luồng, không có trình bao bọc hoặc điều chỉnh khác cần thiết.
Dưới đây là một số ví dụ về những điều đến gần:
Nokogiri. Nếu tôi viết trình bao bọc này, tôi có thể gọi trình bao bọc theo cách được mô tả ở trên:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath. Sẽ làm việc với trình bao bọc này:
#!/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
từ XML :: XPath trả lại quá nhiều tiếng ồn -- NODE --
và attribute = "value"
.
xml_grep
từ XML :: Twig không thể xử lý các biểu thức không trả về các phần tử, do đó không thể được sử dụng để trích xuất các giá trị thuộc tính mà không cần xử lý thêm.
BIÊN TẬP:
echo cat //element/@attribute | xmllint --shell filename.xml
trả về tiếng ồn tương tự như xpath
.
xmllint --xpath //element/@attribute filename.xml
trả lại attribute = "value"
.
xmllint --xpath 'string(//element/@attribute)' filename.xml
trả về những gì tôi muốn, nhưng chỉ cho trận đấu đầu tiên.
Đối với một giải pháp khác gần như thỏa mãn câu hỏi, đây là một XSLT có thể được sử dụng để đánh giá các biểu thức XPath tùy ý (yêu cầu dyn: đánh giá hỗ trợ trong bộ xử lý 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>
Chạy với xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
.
xpath
trên STDERR chứ không phải STDOUT.