2010-08-12 7 views
1

J'utilise ce code pour analyser XML dans la variable d'instance response:XML Objective-C Parsing

@implementation Delegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
MKFacebook *fbConnection = [[MKFacebook facebookWithAPIKey:@"----" delegate:self] retain]; 
[fbConnection login]; 

NSMutableDictionary *parameters = [[[NSMutableDictionary alloc] init] autorelease]; 
MKFacebookRequest *request = [MKFacebookRequest requestWithDelegate:self]; 

//set up parameters for request 
[parameters setValue:[NSArray arrayWithObjects:[fbConnection uid], @"123456789", nil] forKey:@"uids"]; 
[parameters setValue:[NSArray arrayWithObjects:@"first_name",@"last_name",nil] forKey:@"fields"]; 

//send the request 
[request sendRequest:@"users.getInfo" withParameters:parameters]; 
} 


-(void)userLoginSuccessful 
{ 
NSLog(@"neat"); 
} 


- (void)facebookRequest:(MKFacebookRequest *)request responseReceived:(NSString *)response 
{ 
CFStringRef response = (CFStringRef)response; 
NSData *xmlData = [[NSData alloc] initWithData:[response2 dataUsingEncoding:NSUTF8StringEncoding]]; 
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:xmlData] autorelease]; 
[parser setDelegate:self]; 
[parser parse];  
} 

Mais, je reçois cette erreur de la console lors de l'exécution du code:

2010-08-12 20:24:46.924 App[2966:a0f] -[NSXMLDocument dataUsingEncoding:]: unrecognized selector sent to instance 0x47c250 

Merci d'avance :)

Répondre

1

Il semble que vous implémentez la méthode déléguée de manière incorrecte. Selon le MKAbeFook documentation, la signature doit être:

- (void)facebookRequest:(MKFacebookRequest *)request responseReceived:(id)response 

response est un NSArray ou NSDictionary si vous avez spécifié le type de réponse JSON. Puisque vous semblez obtenir un NSXMLDocument, il doit être par défaut au type de réponse XML. Le XML est déjà analysé et converti en DOM, vous n'avez donc pas besoin de l'analyser. Jetez simplement la réponse et allez travailler avec le NSXML tree-based API.

NSXMLDocument *document = (NSXMLDocument *)response; 
NSArray *someChildren = [document nodesForXPath:@"//foo" error:NULL]; 
... 
+0

merci beaucoup, je pense que c'est corrigé :) –

0

Deux pensées:

  1. Il est inutile de alloc/init un nouvel objet de données. Vous pouvez simplement faire: NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:response] autorelease];
  2. Mettez un point d'arrêt sur objc_exception_throw et découvrez d'où provient cette exception (le sélecteur non reconnu).
+0

il est dit qu'il provient de [parser parse]; des idées? –

0

Votre problème est que XmlData n'est pas initialisé correctement (je pense):

NSData *xmlData = [[NSData alloc] initWithData:(id)response]; 

Pour une raison quelconque vous response coulée comme id. initWithData attend à passer un objet NSData, par conséquent, vous devez convertir response à un NSData (qui est actuellement un NSString) avec quelque chose comme:

NSData *xmlData = [[NSData alloc] initWithData:[response dataUsingEncoding:NSUTF8StringEncoding]; 
+0

obtenir la même erreur :(* si * ennuyeux –

+0

Avez-vous passé à travers avec Gdb? Je ne pense pas que le code ci-dessus est votre problème, avez-vous un numéro de ligne, donc vous êtes sûr? – benofsky

+0

'Variable est pas une CFString ', aucune idée de ce que cela signifie? http://skitch.com/james-eggers/dt3yk/error –