Problème NSXMLParser
bonjour, je reviens vers vous concernant mon problème.
J'aimerai récupérer la valeur de ce qui se trouve entre les balises <Estado>1</Estado> :
2015-03-15 20:57:59.841 agriduino[763:289187] <?xml version="1.0" encoding="utf-8"?>
<estadoDomotica>
<Pin><Nombre>Pin 2</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 3</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 4</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 5</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 6</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 7</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 8</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Pin 9</Nombre><Estado>0</Estado></Pin><Pin><Nombre>Analog 0</Nombre><Estado>200</Estado></Pin><Pin><Nombre>Analog 1</Nombre><Estado>213</Estado></Pin><Pin><Nombre>Analog 2</Nombre><Estado>184</Estado></Pin><Pin><Nombre>Analog 3</Nombre><Estado>184</Estado></Pin><Pin><Nombre>Analog 4</Nombre><Estado>217</Estado></Pin><Pin><Nombre>Analog 5</Nombre><Estado>127</Estado></Pin></estadoDomotica>
Mon passer fonctionne jusqu'à mon message d'erreur.
Voici ce que j'ai fait :
Ma classe état : état.m
#import <Foundation/Foundation.h>
@interface etat : NSObject {
NSString * Pin;
NSString * Nombre;
NSString * Estado;
}
@property (nonatomic, retain) NSString *Pin;
@property (nonatomic, retain) NSString *Nombre;
@property (nonatomic, retain) NSString *Estado;
@end
Ma classe XMLEtatParser :XMLEtatParser.m
#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]) {
// create an instance of a class on run-time
item = [[NSClassFromString(className) alloc] init];
}
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];
}
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 ViewControlleur.m
#import "ViewController.h"
#import "XMLEtatParser.h"
#import "etat.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize contenue;
- (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:@Nombre parseError:nil];
for(int i = 0; i < [[myParser items] count]; i++) {
NSLog(@Nombre: %@", [( etat *)[[myParser items] objectAtIndex:i] Nombre]);
}
}
@end
et voici ce que la console me renvoie :
2015-03-28 12:35:19.488 xmltest[4454:1925383] Ouvre balise: estadoDomotica
2015-03-28 12:35:19.490 xmltest[4454:1925383] Ouvre balise: Pin
2015-03-28 12:35:19.490 xmltest[4454:1925383] Ouvre balise: Nombre
2015-03-28 12:35:19.490 xmltest[4454:1925383] Ferme balise: Nombre
2015-03-28 12:35:19.493 xmltest[4454:1925383] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x18365e530 0x1946340e4 0x1835473e0 0x1000f21b0 0x1845621dc 0x194ae0f50 0x194adce84 0x194adbac4 0x18455f188 0x18455f424 0x18455f5f4 0x1000f1d00 0x1000f15b8 0x187ea0a14 0x187e89d08 0x187ea03b0 0x187ea003c 0x187e99590 0x187e6ce60 0x18810c46c 0x187e6b3d0 0x183616d34 0x183615fd8 0x183614088 0x1835411f4 0x18c9636fc 0x187ed210c 0x1000f1b3c 0x194cb2a08)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
Il devait m'afficher dans la console ce qui se trouve dans la balise Nombre ( 0 ou 1)
Je ne comprend pas trop, pouvez vous me donner un petit coup de main
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Dans l'doute, je dirais que item est nil.
Les conventions c'est pas juste pour faire joli, ça fait partie intégrante du langage (y compris pour KVO/KVC mais aussi pour le static analyzer et pour ARC car si tu ne suis pas les conventions ARC va faire n'importe quoi aussi. Donc c'est important.
Ok désolé pour les conventions , je vais corriger.
Mais c'est pas pour ça que ça ne fonctionne pas.
En effet Larme, l'erreur doit etre là , xcode me le souligne. Mais je ne comprend pas pourquoi. Comment puis faire pour récupérer cette valeur ( Nombre ?)
Y'a un alloc/init quelquepart de item, mais je n'ai jamais vu de setting de sa valeur, ce qui pose déjà soucis, mais ne devrait pas causer en théorie cette erreur.
Je pense que tu serais plus intéressé par y mettre string, paramètre de parser:foundCharacters: en réalité.