2009-02-20 59 views
2

使用XPath可以使用什麼Ruby庫來選擇屬性,並將其用作其他XPath查詢的起點。Ruby XPath查找屬性

實施例:

<root> 
    <add key="A" value="B" /> 
    <add key="C" value="D" /> 
    <add foo="E" bar="F" /> 
</root> 

希望的代碼:

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 

回答

4

你的起點是REXML

「挑戰」在這裏是如何看待的屬性節點作爲子節點,而這可以通過使用singleton methods來完成,那麼一切遵循自然:

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" 
0

我也建議尋找角度來說,Hpricot ......這是一個非常富有表現力的HTML和XML解析庫,的jQuery的啓發。

1

如果您將在性能問題的任何區域解析體面的數據量,那麼您將需要libxml-ruby。 REXML和Hpricot都很好,但是最近我不得不在自己的服務器上進行一些解析工作,因爲它的速度提高了大約1200%。

0

REXML,附帶了紅寶石會做你想要什麼:

require 'rexml/document' 
include REXML 
xml = Document.new('<root><add key="A" value="B" /><add key="C" value="D" /><add foo="E" bar="F" /></root>') 
xml.root.each_element_with_attribute('key'){|e| puts "#{e.attribute('key')} #{e.attribute('value')}"} 
3

顯然引入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 

編輯:這並不奇怪原來outthat聲稱引入nokogiri快不無爭議。

然而,我們發現它比我們的生產environmenty libxml的更穩定(libxml的偶爾崩潰,只是在引入nokogiri交換已經解決了這個問題)

+0

它描述爲「比的libxml-紅寶石略慢」的HTTP ://tenderlovemaking.com/2008/10/30/nokogiri-is-released/評論部分。 – 2009-02-23 02:05:55