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
Cette discussion a été fermée.
Réponses