在XML文件中创建导航菜单

时间:2018-06-15 20:57:53

标签: ruby-on-rails ruby xml nokogiri

我得到了这个相当多的XML文件,需要使用Nokogiri解析它并使用Ruby 2.3.1进行处理,并生成一个数组,以便我可以显示嵌套链接的菜单。

Here is the XML

所以我的想法就是拥有一个这样的菜单:

Africa
  South Africa
    Cape Town
      Table Mountain National Park
    Free State
      Bloemfontein
  ...
  Sudan
    Eastern Suda
  ...
  Swaziland

我能够解析XML并导航获取这样的节点:

xml_doc.xpath('//node_name')
.map {|n| { name: n.text,
            atlas_node_id: n.parent['atlas_node_id'],
            ethyl: n.parent['ethyl_content_object_id'] } }

这只是生成和散列数组,但是以一种扁平的方式,我很难制作一个数组,我可以在我的视图中迭代并获得所需的结果。任何指针都将非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以使用递归函数来处理该结构。

之类的东西
require 'nokogiri'
require 'open-uri'

# Fetch and parse XML document
doc = Nokogiri::XML(open('https://pastebin.com/raw/nD0b7H3u'))

# we have a revursive function that prints the xml by levels
def parse_menu(xml, level)
  level+=1
  xml.xpath("node").each do |menu_item|
    puts "#{" " * level}#{menu_item.xpath("node_name").text}"
    parse_menu(menu_item, level)
  end
end

# we call the function
parse_menu(doc.xpath('taxonomies/taxonomy'), -1)

这将打印如下:

Africa
 South Africa
  Cape Town
   Table Mountain National Park
  Free State
   Bloemfontein
  Gauteng
   Johannesburg
   Pretoria
  KwaZulu-Natal
   Durban
   Pietermaritzburg
  Mpumalanga
   Kruger National Park
  The Drakensberg
   Royal Natal National Park
  The Garden Route
   Oudtshoorn
   Tsitsikamma Coastal National Park
 Sudan
  Eastern Sudan
   Port Sudan
  Khartoum
 Swaziland

当然你只需要修改一下这个函数,也许是在帮助器中,用你的菜单的ul和li标签打印它们,因为它取决于你的前端