récupérer valeur dans balise xml avec NSxmlparser

Bonjour à  tous, j'ai un  petit soucis, j'aimerai récupérer ce qui se trouve dans une de mes balises, mais lors de la compilation, les balises sont bien ouvertes  et fermées, mais à  la fin la valeur est nul .


Je ne vois pas trop d'ou peu venir mon erreur.


 


mon code : etat.h



// etat.h
// xmltest
//
// Created by frederic zimmermann on 24/03/2015.
// Copyright (c) 2015 frederic zimmermann. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Etat : NSObject {


NSString * namePin;
NSString * etat;
NSString * temperature;
NSString * valeur; }

@property (nonatomic, retain) NSString *namePin;
@property (nonatomic, retain) NSString *etat;
@property (nonatomic, retain) NSString *temperature;
@property (nonatomic, retain) NSString *valeur;


@end


etat.m



// etat.m
// xmltest
//
// Created by frederic zimmermann on 24/03/2015.
// Copyright (c) 2015 frederic zimmermann. All rights reserved.
//

#import "etat.h"

@implementation Etat
@synthesize namePin,etat,temperature,valeur;

@end



XMLEtatParser.h



// xmltest
//
// Created by frederic zimmermann on 26/03/2015.
// Copyright (c) 2015 frederic zimmermann. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface XMLEtatParser : NSObject <NSXMLParserDelegate> {
NSString *className;
NSMutableArray *items;
NSObject *item;
NSString *currentNodeName;
NSMutableString *currentNodeContent;
}
- (NSArray *)items;
- (id)parseXMLAtURL:(NSURL *)url
toObject:(NSString *)aClassName
parseError:(NSError **)error;
@end


XMLEtatParser.m



// XMLEtatParser.m
// xmltest
//
// Created by frederic zimmermann on 26/03/2015.
// Copyright (c) 2015 frederic zimmermann. All rights reserved.
//

#import "XMLEtatParser.h"

@implementation XMLEtatParser


- (NSArray *)items
{
return items;
}

- (id)parseXMLAtURL:(NSURL *)url
toObject:(NSString *)aClassName
parseError:(NSError **)error
{

items = [[NSMutableArray alloc] init];
className = aClassName;
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
{


NSLog(@Ouvre balise: %@", elementName);
if([elementName isEqualToString:className]) {

item = [[NSClassFromString(className) alloc] init];

// create an instance of a class on run-time
}
else {
currentNodeName = [elementName copy];
currentNodeContent = [[NSMutableString alloc] init];
}

}

- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
NSLog(@Ferme balise: %@", elementName);
if([elementName isEqualToString:className]) {
[items addObject:item];
item = nil;
}
else if([elementName isEqualToString:currentNodeName]) {
// use key-value coding

[item setValue:currentNodeContent forKey:elementName];
currentNodeContent = nil;


currentNodeName = nil;
}
}

- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
[currentNodeContent appendString:string];
}

@end


mon ViewController.h



// ViewController.h
// xmltest
//
// Created by frederic zimmermann on 23/03/2015.
// Copyright (c) 2015 frederic zimmermann. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITextFieldDelegate> {

IBOutlet UITextField *_contenue;
}

@property (weak, nonatomic) IBOutlet UITextField *contenue;
@property (weak, nonatomic) IBOutlet UILabel *label;

@end


mon ViewController.m



// ViewController.m
// xmltest
//
// Created by frederic zimmermann on 23/03/2015.
// Copyright (c) 2015 frederic zimmermann. All rights reserved.
//

#import "ViewController.h"
#import "XMLEtatParser.h"
#import "etat.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize contenue,label;

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)parse:(id)sender {


NSString *myURLString =[NSString stringWithFormat:@http:;//%@", contenue.text];
NSURL *url =[NSURL URLWithString:myURLString];

XMLEtatParser *myParser = [[XMLEtatParser alloc]
parseXMLAtURL:url toObject:@Etat parseError:nil];

for(int i = 0; i < [[myParser items] count]; i++) {
NSLog(@valeur: %@", [( Etat *)[[myParser items] objectAtIndex:i] namePin]);


}


}




@end


et voici ce que m'affiche mon NSLog :



2015-07-05 11:03:28.185 xmltest[2360:758832] Ouvre balise: agridomotique
2015-07-05 11:03:28.186 xmltest[2360:758832] Ouvre balise: Pin
2015-07-05 11:03:28.187 xmltest[2360:758832] Ouvre balise: p
2015-07-05 11:03:28.187 xmltest[2360:758832] Ouvre balise: namePin
2015-07-05 11:03:28.188 xmltest[2360:758832] Ferme balise: namePin
2015-07-05 11:03:28.188 xmltest[2360:758832] Ouvre balise: Etat
2015-07-05 11:03:28.189 xmltest[2360:758832] Ferme balise: Etat
2015-07-05 11:03:28.189 xmltest[2360:758832] Ferme balise: p
2015-07-05 11:03:28.190 xmltest[2360:758832] Ouvre balise: p
2015-07-05 11:03:28.190 xmltest[2360:758832] Ouvre balise: Temp
2015-07-05 11:03:28.191 xmltest[2360:758832] Ferme balise: Temp
2015-07-05 11:03:28.191 xmltest[2360:758832] Ouvre balise: valeur
2015-07-05 11:03:28.192 xmltest[2360:758832] Ferme balise: valeur
2015-07-05 11:03:28.192 xmltest[2360:758832] Ferme balise: p
2015-07-05 11:03:28.192 xmltest[2360:758832] Ouvre balise: Humid
2015-07-05 11:03:28.193 xmltest[2360:758832] Ferme balise: Humid
2015-07-05 11:03:28.193 xmltest[2360:758832] Ouvre balise: valeurh
2015-07-05 11:03:28.194 xmltest[2360:758832] Ferme balise: valeurh
2015-07-05 11:03:28.194 xmltest[2360:758832] Ferme balise: Pin
2015-07-05 11:03:28.195 xmltest[2360:758832] Ferme balise: agridomotique
2015-07-05 11:03:28.195 xmltest[2360:758832] valeur: (null)


Merci d'avance pour votre aide


Réponses

  • AliGatorAliGator Membre, Modérateur
    Dans ton dictionnaire item tu mets toujours la même référence currentNodeContent sans la copier.

    C'est donc [*]le même objet[/*] que tu mets dans tous ces items (car en ObjC les NSString sont des objets donc des références, des pointeurs quoi). Et cet objet currentNodeContent tu le mets à  nil a chaque fermeture de balise.


    C'est un peu comme si tu écrivais sur un tableau Veleda le contenu de ta valise (currentNodeContent), puis tu faisais pointer ton dictionnaire items sur le tableau Veleda et ensuite tu effaces ce tableau pour mettre la chaà®ne suivante etc... comme ton dictionnaire pointe sur le tableau et pas une copie de son contenu, et qu'à  chaque fois tu effaces le tableau, tu n'auras jamais rien dans ton dictionnaire que des pointeurs vers le même et unique tableau Veleda que tu arrêtes pas d'effacer. Alors que tu devrais plutôt prendre une photo de ton tableau à  chaque fois, ou recopier le contenu du tableau sur une feuille de papier, et stocker cette photo ou cette feuille avant de passer au Node suivant et d'effacer ton tableau. Et du coup tu stockerais dans items non pas des références vers le même tableau régulièrement effacé, mais des photos distinctes et le indépendantes du tableau a chaque fois, qui ne sont plus affectées quand tu effaces ton tableau car la photo, elle, reste intacte.



    Donc ce qu'il faut faire c'est une copie de currentNodeContent quand tu le stockes dans ton dictionnaire items pour que la copie de cette chaà®ne que tu stockes soit une instance indépendante.
  • Merci, je commence un peu à  comprendre, mais alors je devrai faire comment ?
  • AliGatorAliGator Membre, Modérateur
    Bah comme j'ai dit dans ma dernière phrase.
  • Oui, mais sans vouloir abuser, peux tu me mettre un petit bout de code s'il te plait !
  • AliGatorAliGator Membre, Modérateur
    juillet 2015 modifié #6
    Utilise [currentNodeContent copy]


    Et va lire le programming guide sur le Memory Management, NSCopying, et les copies d'objets.
  • Ok merci
Connectez-vous ou Inscrivez-vous pour répondre.