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 <root> > <categorie> > <name>Voitures</name> > <sous_menu> > <name>Débutant</name> > <page> > <id>211</id> > </page> > </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> > </categorie> > </root> 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, > :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("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, > :name => taxon_menu_name, > :parent_id => 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("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, > :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 + " " + 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("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, 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. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk@googlegroups.com To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---