[Rake] Parse XML File, recursive function

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.