Hi everybody,
I’m taking time to post message here because, i have a problem which making me crazy.
I’m trying to design a Rake Task which parse XML file and create some drill down on products categories.
To begin my explanation, some file and function.
First, my XML file
Voitures Débutant 211</sous_menu> <sous_menu> <name>Intermédiaires</name> <page> <id>418</id> </page> <sous_menus> <sous_menu> <name>Dnano</name> <page> <id>769</id> </page> </sous_menu> <sous_menu> <name>Mini Z</name> <page> <id>710</id> </page> </sous_menu> <sous_menu> <name>Mini Z Drift</name> <page> <id>783</id> </page> </sous_menu> </sous_menus> </sous_menu> <sous_menu> <name>Expérimenté</name> <page> <id>419</id> </page> </sous_menu> <sous_menu> <name>Monster Truck</name> <page> <id>420</id> </page> </sous_menu>
Pastie link : http://pastie.org/459107
Second, my main Rake Task
Affichage d un message
p '### Creation Fil ariane root' # Creation du fil d ariane root root = Taxonomy.create( :name => 'fxmodelrc' ) # Creation des categories dites mere (Products) categorie_mere_root = Taxon.create( :taxonomy_id => [root.id](http://root.id), :name => 'Catégories', :position => 0 ) # Definition du fichier XML d FXModel xml_file = "#{RAILS_ROOT}/lib/tasks/fxmodel/products/menuFXModel.xml" # Si le fichier xml est present if File.exist?(xml_file) # Lecture du fichier XML xml = File.read(xml_file) # Parse du fichier XML doc = Hpricot::XML(xml) # Recuperation de toutes les categories (doc/:root).each do |categories| # Pour chaque categorie taxon_menu = Array.new (categories/:categorie).each_with_index do |categorie, index_menu| # On est dans une categorie (Helicoptere, Voitures, etc...) # Preparation variable taxon_sous_menu = Array.new # Recuperation du nom de la categorie taxon_menu_name = [categorie.at](http://categorie.at)("name").inner_html.to_s # Concatenation pour l affichage message = '### Creation Menu ' + taxon_menu_name + ' / ' # Affichage d un message p message # Creation de la categorie mere en cours taxon_menu[index_menu] = Taxon.create( :taxonomy_id => [root.id](http://root.id), :name => taxon_menu_name, :parent_id => [categorie_mere_root.id](http://categorie_mere_root.id), :position => index_menu ) # Recuperation de l'ID mere taxon_menu_id = taxon_menu[index_menu].id # Recursive sub menu recursive_sous_menu_creation(categorie, message, taxon_menu_id, root) end end end
Pastie link : http://pastie.org/459108
Third, Recursive function “recursive_sous_menu_creation”
def recursive_sous_menu_creation(xml, message, taxon_mother_id, root)
(xml/:'sous_menu').each_with_index do |sous_menu, index_sous_menu| # Recuperation du nom du sous menu sous_menu_name = [sous_menu.at](http://sous_menu.at)("name").inner_html.to_s # Concatenation du message message += sous_menu_name + ' / ' # Affichage d un message p message # Creation de la Taxon taxon_sous_menu_mother = Taxon.create( :taxonomy_id => [root.id](http://root.id), :name => sous_menu_name, :parent_id => taxon_mother_id, :position => index_sous_menu ) p taxon_sous_menu_mother.id.to_s + " " + [taxon_sous_menu_mother.name](http://taxon_sous_menu_mother.name) + " " + taxon_sous_menu_mother.parent_id.to_s # Recuperation des pages s il y en a if sous_menu.find_element('page') # Instanciation d un tableau pour la concatenation des pages array_page = Array.new # Pour chaque page (sous_menu/:page).each_with_index do |page, index| # On insert l ID dans le tableau array_page[index] = Integer [page.at](http://page.at)("id").inner_html.to_s end # Apres creation du tableau des pages # Lancement de l import import_article_from_categorie_id_and_set_taxons(array_page,taxon_sous_menu_mother) end # Test si il y a des sous menus if sous_menu.find_element('sous_menus') # Traitement sous-menus (sous_menu/:'sous_menus').each_with_index do |sous_sous_menu, index_sous_sous_menu| recursive_sous_menu_creation(sous_sous_menu, message, [taxon_sous_menu_mother.id](http://taxon_sous_menu_mother.id), root) end end end
end
Pastie link : http://pastie.org/459110
And, the end, the result
“#############################” “# create_products #” “#############################”
“### Truncate des differentes tables produits” “### Suppression du contenu des dossiers public/assets/products/ et public/images/products/” “### Truncate des differentes tables pour les menus”
“### Creation Fil ariane root” "### Creation Menu Voitures / " "### Creation Menu Voitures / Débutant / " “3 Débutant 2” “15933:FC2000:Flycam one 2 caméra version de luxe:56.97:21”
“17537:FC2200:Flycam one 2 extreme sports box:89.8:10” “17541:FC2004:Caisson étanche pour flycam one 2:18.99:2” “17559:LOSB0235:1/36 micro raminator rtr:89.99:2” “18413:870010056:Nitro rs4 3 evo+ greedy 350z rtr:352.5:1”
"### Creation Menu Voitures / Débutant / Intermédiaires / " “4 Intermédiaires 2” “16219:870010074:Hpi - nitro rs4 drift toy soarer rtr:352.5:0” “14196:870010256:Hpi - nitro 3 18ss:496:1”
“16220:870010411:Nitro mt2 g3.0 rtr - hpi:436.59:0” “16572:46008700:Gtx 25 delta 25 2pi loisir:394:1” “16494:870010712:E10 drift mazda rx7 peinte rtr:148.76:2” “16598:870010716:E10 touring mustang gtr peinte rtr 200mm:148.76:1”
“16957:46008900:Gtx 25 pro 3pm et nitro star 4.1:336.15:0” “16955:870010715:E10 touring skyline r32 peinte rtr 200mm:148.76:1” “17145:1400103015:Porsche 911 gt3 1/10 rtr:233.28:1” “17146:1400103012:Lawados 1/10 rtr:224.12:2”
“17207:870010508:Trophy 3.5 rtr:308.79:0” “18369:30569PW:Miniz ma010 awd mitsubishi evo x nacre:178:1” "### Creation Menu Voitures / Débutant / Intermédiaires / Dnano / " “5 Dnano 2”
"### Creation Menu Voitures / Débutant / Intermédiaires / Dnano / Mini Z / " “6 Mini Z 2” "### Creation Menu Voitures / Débutant / Intermédiaires / Dnano / Mini Z / Mini Z Drift / "
“7 Mini Z Drift 2” "### Creation Menu Voitures / Débutant / Intermédiaires / Dnano / Mini Z / Mini Z Drift / Expérimenté / " “8 Expérimenté 2” “14041:870010601:Hpi - baja 1/5 rtr:999.9:1”
“13698:304002:Hpi - carson 1/5 mercedes classe c:808.38:0” “16217:870010611:Hpi - baja ss 1/5:894:1” “18366:31315T1:Racing kart birel r31-se 1/5 ready set:251.25:1” “18421:G68050:Baja buggy 4wd carosserie transporteur:750:0”
"### Creation Menu Voitures / Débutant / Intermédiaires / Dnano / Mini Z / Mini Z Drift / Expérimenté / Monster Truck / " “9 Monster Truck 2” “15172:87000868:Hpi - savage x 4.6 rtr:610.5:2”
“14209:87000882:Hpi - savage 3.5:351.9:0” “14653:870010501:Hpi - hellfire:721.2:0” “17422:870010621:Baja 5t truck 1/5ième blanc rtr:1248:1” “16683:870010516:Savage xl 5.9 rtr:611:0”
“17964:87000548:E-savage truck gt rtr:415.95:0” “17965:8700100647:Savage flux rtr:826.26:1” “18455:G20010R:Monster truck complet:833:1” “18456:G60020R:Baja buggy 26cm3 rtr:831.25:1”
Observation
First, my concatenation message is wrong, because, my rake task create sub categories (Dnano, Mini Z / Mini Z Drift) on the categories “Intermédiaire”, but, it doing the same on the root of “Voiture”
All help is greathy appreciate.
Best regards,
Mickaël.