从 XML 文件创建导航菜单

Create Navigation menu off XML file

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

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'] } }

这只是生成哈希数组,但以一种扁平的方式,我很难制作一个数组,我可以在我的视图中迭代并获得所需的结果。任何指点将不胜感激!

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

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 标签中,因为这取决于你的前端