使用Nokogiri最好从XML文件中获取“strings / that / are / paths”数组的最快,最简单/最短的方法是什么。我想构建具有任意属性名称的数组(在本例中为'id'),但是知道如何为元素名称执行它也会有所帮助。
所以这个:
<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>
到此:
<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>
非常感谢。
答案 0 :(得分: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
输出:
jablan@jablan-hp:~/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"]