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')}"}