NSXMLDocument fonctionne sur simulateur mais pas sur device
bonjour,
J'ai eu la désagréable surprise quand j'ai voulu tester mon application directement sur mon iPhone, d'avoir des erreurs de compilation... Alors que le programme tourne sans problème dans le simulateur. J'ai suivi un tutorial cocoa pour pourvoir faire des requêtes XQuery dans un fichier XML. le NSXMLDocument n'est pas reconnu quand je compile pour le device. Serait-ce une classe qui s'utilise différemment pour iPhone ? Mais alors pourquoi le simulateur n'a pas d'erreurs de compilation ?
mon code
J'ai eu la désagréable surprise quand j'ai voulu tester mon application directement sur mon iPhone, d'avoir des erreurs de compilation... Alors que le programme tourne sans problème dans le simulateur. J'ai suivi un tutorial cocoa pour pourvoir faire des requêtes XQuery dans un fichier XML. le NSXMLDocument n'est pas reconnu quand je compile pour le device. Serait-ce une classe qui s'utilise différemment pour iPhone ? Mais alors pourquoi le simulateur n'a pas d'erreurs de compilation ?
mon code
<br />#import <UIKit/UIKit.h><br />#import <Foundation/Foundation.h><br /><br /><br />@interface InfoSheetViewController : UIViewController {<br /><br /> IBOutlet UILabel *title ;<br /> IBOutlet UITextView * body ;<br /> IBOutlet UIImageView * image;<br />}<br /><br />@property (nonatomic, retain) UILabel * title ;<br />@property (nonatomic, retain) UITextView *body ;<br />@property (nonatomic, retain) UIImageView * image;<br /><br /><br />- (NSString *)getStringFromXquery:(NSString *)xquery fromXMLDoc:(NSXMLDocument *)xmlDoc ;<br /><br />@end
[super viewDidLoad];<br /> <br /> NSBundle * mainBundle=[NSBundle mainBundle];<br /> <br /> NSString *file = [[NSString alloc] initWithString:[mainBundle pathForResource:@"LowSpeed" ofType:@"xml"]];<br /> <br /> NSXMLDocument *xmlDoc; <br /> <br /> NSError *err=nil; <br /> <br /> NSURL *furl = [NSURL fileURLWithPath:file]; <br /> <br /> if (!furl) { <br /> <br /> NSLog(@"Can't create an URL from file %@.", file); <br /> <br /> return; <br /> <br /> } <br /> <br /> xmlDoc = [ [NSXMLDocument alloc] initWithContentsOfURL:furl options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA) error:&err]; <br /> if (xmlDoc == nil) { <br /> <br /> xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl <br /> <br /> options:NSXMLDocumentTidyXML <br /> <br /> error:&err]; <br /> <br /> NSLog(@"error");<br /> <br /> } <br /> <br /> title.text = [self getStringFromXquery:@"/infosheet/title" fromXMLDoc:xmlDoc] ;<br /> body.text = [self getStringFromXquery:@"/infosheet/body" fromXMLDoc:xmlDoc] ;<br /> <br /> NSString * imgName = [self getStringFromXquery:@"/infosheet/image/name" fromXMLDoc:xmlDoc] ;<br /> <br /> UIImage * myImage = [[[UIImage alloc] initWithContentsOfFile: [mainBundle pathForResource:imgName ofType:@"png"]] autorelease ];<br /> [image setImage:myImage];<br /> <br /> <br /> <br /> <br />}<br /><br /><br />- (NSString *)getStringFromXquery:(NSString *)xquery fromXMLDoc:(NSXMLDocument *)xmlDoc {<br /> <br /> NSError *err=nil; <br /> NSXMLElement *returnedElement; <br /> NSArray *nodes = [xmlDoc nodesForXPath:xquery error:&err]; <br /> <br /> if ([nodes count] > 0 ) <br /> { <br /> returnedElement = [nodes objectAtIndex:0]; <br /> NSLog( [[returnedElement childAtIndex:0 ] objectValue] );<br /> return [[returnedElement childAtIndex:0 ] objectValue];<br /> <br /> }<br /> else<br /> return err ;<br /> <br /> <br /> <br /> <br />}<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
En effet, NSXMLDocument présuppose d'avoir la structure XML entièrement en mémoire pour pouvoir travailler dessus.
Apple recommande donc d'utiliser à la place NSXMLParser qui réalise le traitement du xml à la volée (au fur et à mesure que le document est lu).
C'est plus complexe à utiliser, et ça ne permet pas de modifier le document xml de manière aisée.
Il y a des différences entre les frameworks pour Mac et ceux pour iPhone. Tu trouveras tout le détail ici :Doc Apple sur l'iPhone Dev Center.
Or il se trouve que l'iPhone Simulator tournant sous OSX, il y a quelques passerelles involontaires apparament entre le simulateur et ton MacOSX.
Par exemple j'ai réussi (et ça m'a arrangé pour le coup ;D) à partager des notifications (via le NSDistributedNotificationCenter) entre le simulateur iPhone et MacOSX, ce qui m'a permis d'envoyer depuis une appli MacOSX des informations (via une notofication) à mon appli iPhone dans le simulateur (qui observait cette notification)... Alors que bien sûr sur vrai iPhone ça n'a pas de sens.
Je pense donc que pour le coup du NSXMLDocument c'est un peu la même chose, il a fini par le trouver pendant la compilation sur iPhone Simulator parce que bon il traà®ne sur ton OSX qqpart, mais c'est pas très "normal" pour autant.
En l'occurence la Doc Apple dit bien ceci concernant NSXMLDocument :
(Source: même page que plus haut)
Donc tu aurais dû y faire gaffe dès le début, c'est indiqué dans ces docs accessibles dès la home page du iPhone Dev Center...
Disons qu'il faut surtout lire la doc Iphone en premier lieu avant de se lancer bille en tête dans la programmation sur cet appareil...
Les différences entre les 2 OS (Mac et iphone) ne sont un secret pour personne, donc c'est bien la première chose à vérifier quand on vient du monde Mac.