0

できれば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>

これに:


[
  "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"
]

本当にありがとう。

4

1 に答える 1

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"]
于 2009-11-20T12:23:29.693 に答える