【问题标题】:Fastest/One-liner way to get XML nodes into array of "path/to/nodes" in Ruby?在Ruby中将XML节点放入“路径/到/节点”数组的最快/单线方法?
【发布时间】:2009-11-20 20:23:29
【问题描述】:

从 XML 文件中获取“字符串/那个/是/路径”数组的最快、单行/最短的方法是什么,最好使用 Nokogiri。我想使用任意属性名称(在本例中为“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"
]

非常感谢。

【问题讨论】:

    标签: xml ruby xpath nokogiri


    【解决方案1】:

    不完全是单线,也不确定有多快,但这应该可以工作:

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

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 2010-10-25
      • 2013-11-06
      • 2021-12-18
      • 2017-09-14
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多