2009-11-20 3 views
0

Nokogiri를 사용하여 XML 파일에서 "strings/that/are/paths"배열을 가져 오는 가장 빠른, 단선/가장 짧은 방법은 무엇입니까? 임의의 속성 이름 (이 경우 'id')을 사용하여 배열을 작성하고 싶지만 요소 이름에 대해 수행하는 방법을 알고 있으면 도움이됩니다.Ruby에서 XML 노드를 "경로/노드/노드"의 배열로 가져 오는 가장 빠른 방법은?

그래서이 :


<root id="top"> <nodeA id="almost_top"> <nodeB id="a_parent"> <nodeC id="im_a_node"/> <nodeD id="child_node"/> </nodeB> <nodeB id="child"/> </nodeA> </root> 

이것 :


[ "top", "top/almost_top", "top/almost_top/a_parent", "top/almost_top/a_parent/im_a_node", "top/almost_top/a_parent/child_node", "top/almost_top/child" ] 

정말 감사합니다.

답변

2

아니 정확히 한 줄 정확히 얼마나 빨리 확실하지만,이 일을해야하지 :

require 'nokogiri' 

s = '<root id="top"> 
    <nodeA id="almost_top"> 
     <nodeB id="a_parent"> 
       <nodeC id="im_a_node"/> 
       <nodeD id="child_node"/> 
     </nodeB> 
     <nodeB id="child"/> 
    </nodeA> 
</root>' 

xml = Nokogiri::XML.parse s 

def node_list elem, &proc 
    return [] unless elem.class == Nokogiri::XML::Element 
    str = proc.call(elem) 
    [str] + elem.children.inject([]){|a,c| a+node_list(c,&proc)}.map{|e| "#{str}/#{e}"} 
end 

puts node_list(xml.root){|e| e['id']}.inspect 
puts node_list(xml.root){|e| e.name}.inspect 

출력 :

[email protected]:~/dev$ ruby traverse_xml.rb 
["top", "top/almost_top", "top/almost_top/a_parent", "top/almost_top/a_parent/im_a_node", "top/almost_top/a_parent/child_node", "top/almost_top/child"] 
["root", "root/nodeA", "root/nodeA/nodeB", "root/nodeA/nodeB/nodeC", "root/nodeA/nodeB/nodeD", "root/nodeA/nodeB"] 
관련 문제