从 XML 文件创建导航菜单
Create Navigation menu off XML file
我得到了这个相当古老的 XML 文件,需要使用 Nokogiri 解析它并使用 Ruby 2.3.1 进行处理,并生成一个数组以便我可以显示嵌套的 link'菜单。
所以我的想法是有一个像这样的菜单:
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 标签中,因为这取决于你的前端
我得到了这个相当古老的 XML 文件,需要使用 Nokogiri 解析它并使用 Ruby 2.3.1 进行处理,并生成一个数组以便我可以显示嵌套的 link'菜单。
所以我的想法是有一个像这样的菜单:
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 标签中,因为这取决于你的前端