Bonsoir à tous,
Celà maintenant "quelques" heures que je bloque sur un problème de récursivité et de parse de fichier XML.
Coloration syntaxique : http://pastie.org/459107
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 <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>
Je dois parser un fichier XML et créer des catégories de produits dépendante entre elle (pour réintégration dans SPREE).
Voici donc, mes différentes fonctions pour se faire.
Coloration syntaxique : http://pastie.org/459108
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 # 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
Ma fonction récursive "recursive_sous_menu_creation"
Coloration syntaxique : http://pastie.org/459110
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 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
Voici ce qui se passe lors de l'exécution de mon Rake.
Premier constat, je concatène mal le message, car, mon Rake, crée bien, les sous catégories (Dnano, Mini Z / Mini Z Drift) de la catégorie Intermédiaires, mais, il les crée également à la racine de Voiture.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 "#############################" "# 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"
Si vous avez des suggestions, merci de m'en faire part.
Bien cordialement,
Mickaël.
Partager