Bonsoir à tous,

Celà maintenant "quelques" heures que je bloque sur un problème de récursivité et de parse de fichier XML.

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>
Coloration syntaxique : http://pastie.org/459107

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.

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
Coloration syntaxique : http://pastie.org/459108

Ma fonction récursive "recursive_sous_menu_creation"

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
Coloration syntaxique : http://pastie.org/459110

Voici ce qui se passe lors de l'exécution de mon Rake.

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"
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.

Si vous avez des suggestions, merci de m'en faire part.

Bien cordialement,

Mickaël.