Partage
  • Partager sur Facebook
  • Partager sur Twitter

[iPhone] NSXML Parser

A l'aide :)

    16 février 2012 à 21:39:46

    Bonjour a vous,


    Le but de mon application est de Parser un fichier XML en ligne pour en extraire et ensuite afficher certaines de ces valeurs. Je realise ce "projet" pour ma societé pour leur montrer que l' on a tout a fait un interet a nous lancer ds le developpement mobile. Et je veux leur montrer que l' on peut reussir a faire des trucs sympa.

    J' utilise le modele "MVC" pour coder.

    Tout d'abord, voici le type de fichier que je parse : Xml.

    L' objectif : recuperer les valeurs des Tags "Settle" et "Variation" les plus recents pour chaques "Echeances" (Il y a 7 ou 8 echeances et a chaque fois les 10 dernieres dates pour chaques echeances dans le XML. Pour l' instant uniquement les Tags "Echeance", "settle" et "variation" m' interresse.)

    Tout d' abord j' ai crée une classe "Echeance" de type NSObject contenant ceci :

    //
    //  Echeances.h
    //  
    //
    //  Created by xxxxxx on 02/01/12.
    //  Copyright (c) 2012 xxxxxx. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Echeance : NSObject
    {
        NSString *nomEcheance;
        NSString *settle;
        NSString *variation;
    }
    
    
    @property (nonatomic, strong) NSString *settle;
    @property (nonatomic, strong) NSString *variation;
    @property (nonatomic, strong) NSString *nomEcheance;
    
    
    @end
    


    //
    //  Echeances.m
    // 
    //
    //  Created by xxxxxxx on 02/01/12.
    //  Copyright (c) 2012 xxxxxx. All rights reserved.
    //
    
    #import "Echeances.h"
    
    @implementation Echeance
    
    @synthesize settle;
    @synthesize variation;
    @synthesize nomEcheance;
    
    
    @end
    


    Ceci dans le but de pouvoir creer des objets avec les "valeurs" dont j' ai besoin.

    Voici maintenant mon "modele"

    //
    //  XMLToObjectParser.h
    //  
    //
    //  Created by xxxxx on 02/01/12.
    //  Copyright (c) 2012 xxxxxx. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Echeances.h"
    
    @interface XMLToObjectParser : NSObject <NSXMLParserDelegate> 
    
    {
        NSString *nomMarche;
        NSMutableArray *lstEcheance;   
    	NSString *currentNodeName;
    	NSMutableString *currentNodeContent;
        NSMutableDictionary *dico;
        NSMutableArray *settleArray;
        NSMutableArray *expiryArray;
        NSMutableArray *changeArray;
        int compteur;
        
        Echeance *ech;
    }
    
    
    
    
    - (NSMutableArray *)expiry;
    
    - (id)parseXMLAtURL:(NSURL *)url toObject:(NSString *)echeance parseError:(NSError **)error;
    
    
    @end
    


    //
    //  XMLToObjectParser.m
    
    //
    //  Created by xxxxxx on 02/01/12.
    //  Copyright (c) 2012 xxxxxx. All rights reserved.
    //
    
    #import "XMLToObjectParser.h"
    
    
    @implementation XMLToObjectParser
    
    
    
    - (NSMutableArray *)expiry
    
    {
    	return expiryArray;
    }
    
    - (id)parseXMLAtURL:(NSURL *)url toObject:(NSString *)aClassName parseError:(NSError **)error
    {
        currentNodeContent= [[NSMutableString alloc] init];
        expiryArray = [[NSMutableArray alloc] init];
        settleArray = [[NSMutableArray alloc] init];
        ech = [[Echeance alloc] init];
        dico = [NSMutableDictionary dictionary];
        
        
        
    	NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
        
    	[parser setDelegate:self];
    	[parser parse];
        
        
    	if([parser parserError] && error) 
        {
    		*error = [parser parserError];
    	}
    	
    	return self;
    }
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    
    
    {
       
        
        
        
    	if([elementName isEqualToString:@"echeance"]) 
        
        {
            compteur = 0;
            
            ech.nomEcheance = [attributeDict objectForKey:@"nom"];
            
            [expiryArray addObject:ech.nomEcheance];
            
            if (compteur == 0)
            NSLog(@"%@", ech.nomEcheance);
        
    	}
        
    	
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    
    {
    	
        if([elementName isEqualToString:@"settle"]) 
        
        {
            
            
            if (compteur == 0)
            {
               ech.settle = currentNodeContent;
                NSLog(@"settle %@", ech.settle);
            }
        }
        
        else if([elementName isEqualToString:@"variation"]) 
        
        {
            
            
           if (compteur == 0)
           {
               ech.variation = currentNodeContent;
               NSLog(@"change %@", ech.variation);
            
           }
            
            compteur++;
         
        }
        
        
       
    }
    
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {   
        
        [currentNodeContent setString:string];
        
    }
    
    
    
    @end
    


    Grace aux NSLogs que j' ai mis, j' arrive a recuperer les valeurs qui m' interressent et j' obtiens actuellement ceci (les valeurs peuvent etre differentes au moment ou vous lirez ce message car cela change tous les jours)


    GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)
    Copyright 2004 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "x86_64-apple-darwin".
    sharedlibrary apply-load-rules all
    Attaching to process 417.
    2012-02-15 21:43:56.799 JKRAFT[417:f803] Mars 2012
    2012-02-15 21:43:56.801 JKRAFT[417:f803] settle 206.5
    2012-02-15 21:43:56.802 JKRAFT[417:f803] change 0.25
    2012-02-15 21:43:56.804 JKRAFT[417:f803] Juin 2012
    2012-02-15 21:43:56.805 JKRAFT[417:f803] settle 208
    2012-02-15 21:43:56.806 JKRAFT[417:f803] change 0.5
    2012-02-15 21:43:56.808 JKRAFT[417:f803] Août 2012
    2012-02-15 21:43:56.809 JKRAFT[417:f803] settle 210
    2012-02-15 21:43:56.809 JKRAFT[417:f803] change 0.5
    2012-02-15 21:43:56.811 JKRAFT[417:f803] Novembre 2012
    2012-02-15 21:43:56.812 JKRAFT[417:f803] settle 184.5
    2012-02-15 21:43:56.812 JKRAFT[417:f803] change 0
    2012-02-15 21:43:56.814 JKRAFT[417:f803] Janvier 2013
    2012-02-15 21:43:56.814 JKRAFT[417:f803] settle 187
    2012-02-15 21:43:56.815 JKRAFT[417:f803] change 0
    2012-02-15 21:43:56.816 JKRAFT[417:f803] Mars 2013
    2012-02-15 21:43:56.817 JKRAFT[417:f803] settle 189
    2012-02-15 21:43:56.817 JKRAFT[417:f803] change 0
    2012-02-15 21:43:56.819 JKRAFT[417:f803] Juin 2013
    2012-02-15 21:43:56.819 JKRAFT[417:f803] settle 191
    2012-02-15 21:43:56.820 JKRAFT[417:f803] change 1


    Mon probleme se situe en fait, maintenant que j' ai "filtré" les choses dont j' ai besoin, dans le fait de stocker ces informations dans un tableau ou un dictionnaire (ou autrement) .... bref de stocker mon Objet de maniere a recuperer facilement les infos dans mon controller et ainsi pouvoir les afficher dans mes vues.

    j' ai essayé de pas mal de façon differentes mais j' obtiens a chaque fois des resultats tres etranges et pour le moins non exploitables.

    entre autre, j' ai tenté d' ajouter directement mon objet *ech dans un tableau mais j' obtiens ce qui ressemble a des adresses memoires.
    J' aurais voulu creer un dictionnaire qui aurait pour "Key" l'echeance mais je ne vois pas comment lier a UNE clef, DEUX valeurs (le settle ET le change).

    Et au final surtout .... je doute meme etre sur la bonne "piste" tout en sachant qu' a terme "l'application" sera composé visuellement d' un "ViewController" contenant les noms des differentes Echeances et en cliquant sur les echeances, une nouvelle vue apparait contenant 2 labels : 1 pour le settle et 1 pour la variation associés au nom de l' echeance sur laquelle nous venons de cliquer.


    Voila, je comprendrais que vous ne veuillez pas prendre trop de temps car cela est peut etre enorme, (je ne m' en rend pas vraiment compte a vrai dire ... cela fait 3 mois quasiment que je travaille sur cette appli en sautant de tuto en tuto et en devorrant des livres pendant les quelques heures (minutes ....) que j' ai de dispo par jour.)

    En tout cas, quoi qu il arrive, je vous remercie par avance, quelque soit l' aide que vous pourrez me fournir.

    Cordialement

    PS : Il est possible (c'est meme sur) que vous voyez quelques incoherances dans mon code, j' ai fais pas mal de tests, essayé des trucs par ci par la et mon code possede des varaibles et meme des methodes non utilisées.
    Je comptais faire le "menage" une fois mon appli fonctionnelle :p
    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2012 à 22:02:07

      Personne n aurait une petite piste ? Un ptit conseil pour que je relance ma recherche ? La je bloque un peu :( (carrement) et je n arrive plus a avancer !
      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2012 à 11:00:40

        Pourquoi ne pas utiliser un NSUserDefault? C'est rapide, simple, et efficace!
        https://developer.apple.com/library/ma [...] eference.html

        Tu mets toutes tes données dans un dictionnaire ou un array, comme tu veux, et après tu fais

        setObject:(id)value forKey:(NSString *)defaultName

        Par exemple:

        [[NSUserDefaults standardUserDefaults] setObject:TONOBJECT forKey:@"UNNOMPOURIDENTIFIER CETTE DONNEE"];
        

        Et pour le récupérer:
        object = [[NSUserDefaults standardUserDefaults] objectForKey:@"UNNOMPOURIDENTIFIER CETTE DONNEE"];
        



        Et pour stocker tes données dans ton tableau tu fais un tableau à trois dimensions!

        [[DATE, SETTLE, CHANGE], [DATE,SETTLE,CHANGE], [DATE,SETTLE,CHANGE], ...]

        Ou un dictionnaire avec comme key la date et comme valeur un tableau a deux dimensions:

        ["Novembre" => [SETTLE,CHANGE], "Decembre" => [SETTLE,CHANGE]]
        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2012 à 11:08:59

          Hmm !

          Je vais regarder comment ça fonctionne.

          Je connais PAS DU TOUT cette classe :)

          En tout cas merci de t'etre arreté sur ce post :)


          Je met mon resultat en ligne des que j' en ai un concret :)

          ++
          • Partager sur Facebook
          • Partager sur Twitter

          [iPhone] NSXML Parser

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown