Ваша отправная точка будет REXML
Здесь «проблема» заключается в том, как трактовать узел атрибута как дочерний узел, и это можно сделать с помощью одноэлементных методов , тогда все остальное следует естественным образом:
require "rexml/document"
include REXML # so that we don't have to prefix everything with REXML::...
def get_pair(xml_doc, key, value)
XPath.each(xml_doc, key) do |node|
if node.is_a?(Attribute)
def node.parent
self.element
end
end
puts "\"#{node}\" \"#{XPath.first(node, value)}\""
end
end
xml_doc = Document.new <<EOF
<root>
<add key="A" value="B" />
<add key="C" value="D" />
<add foo="E" bar="F" />
</root>
EOF
get_pair xml_doc, "//*/@key", "../@value"
get_pair xml_doc, "//*/@foo", "../@bar"
производит:
"A" "B"
"C" "D"
"E" "F"