Ruby XPath找到属性
可以使用什么Ruby库来使用XPath选择属性 ,并将其用作其他XPath查询的起点。
例:
期望的代码:
get_pair "//*/@key", "../@value" get_pair "//*/@foo", "../@bar"
预期产量:
"A" "B" "C" "D" "E" "F"
伪实现:
def get_pair(key, value) xml_doc.select[key].each do |a| puts [a, a.select[value]] end end
你的出发点是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 get_pair xml_doc, "//*/@key", "../@value" get_pair xml_doc, "//*/@foo", "../@bar"
生产:
"A" "B" "C" "D" "E" "F"
显然Nokogiri是最快的Ruby XML解析器
见http://www.rubyinside.com/nokogiri-ruby-html-parser-and-xml-parser-1288.html
今天使用它,它很棒。
对于你的例子:
doc = Nokogiri::XML(your_xml) doc.xpath("/root/add").map do |add| puts [add['key'], add['value']] end
编辑 :毫不奇怪的是,Nokogiri更快的说法并不是没有争议的。
但是,我们发现它在我们的生产环境中比libxml更稳定(libxml偶尔崩溃;只是在Nokogiri交换已经解决了这个问题)
如果您要在性能很重要的任何区域解析大量数据,那么您将需要libxml-ruby 。 REXML和Hpricot都不错,但我最近不得不在我自己的服务器上进行一些解析,因为它的速度提高了大约1200%。
我还建议看一下Hpricot …它是一个非常富有表现力的HTML和XML解析库,受jQuery的启发。
rexml,随ruby一起来做你想做的事:
require 'rexml/document' include REXML xml = Document.new(' ') xml.root.each_element_with_attribute('key'){|e| puts "#{e.attribute('key')} #{e.attribute('value')}"}