NSXMLDocument fonctionne sur simulateur mais pas sur device

yodarkyodark Membre
07:18 modifié dans API UIKit #1
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
<br />#import &lt;UIKit/UIKit.h&gt;<br />#import &lt;Foundation/Foundation.h&gt;<br /><br /><br />@interface InfoSheetViewController : UIViewController {<br /><br />	IBOutlet UILabel&nbsp; *title ;<br />	IBOutlet UITextView&nbsp; * body ;<br />	IBOutlet UIImageView * image;<br />}<br /><br />@property (nonatomic, retain) UILabel&nbsp; * title ;<br />@property (nonatomic, retain) UITextView&nbsp; *body&nbsp; ;<br />@property (nonatomic, retain)&nbsp; 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:@&quot;LowSpeed&quot; ofType:@&quot;xml&quot;]];<br />	<br />	NSXMLDocument *xmlDoc; <br />	<br />&nbsp; &nbsp; NSError *err=nil; <br />	<br />&nbsp; &nbsp; NSURL *furl = [NSURL fileURLWithPath:file]; <br />	<br />&nbsp; &nbsp; if (!furl) { <br />		<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Can't create an URL from file %@.&quot;, file); <br />		<br />&nbsp; &nbsp; &nbsp; &nbsp; return; <br />		<br />&nbsp; &nbsp; } <br />	<br />&nbsp; &nbsp; xmlDoc = [ [NSXMLDocument alloc] initWithContentsOfURL:furl options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA) error:&amp;err]; <br />	if (xmlDoc == nil) { <br />		<br />&nbsp; &nbsp; &nbsp; &nbsp; xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl <br />				&nbsp; <br />													&nbsp; options:NSXMLDocumentTidyXML <br />				&nbsp; <br />														error:&amp;err]; <br />		<br />		NSLog(@&quot;error&quot;);<br />		<br />&nbsp; &nbsp; } <br />&nbsp;  <br />	title.text = [self getStringFromXquery:@&quot;/infosheet/title&quot; fromXMLDoc:xmlDoc] ;<br />	body.text = [self getStringFromXquery:@&quot;/infosheet/body&quot; fromXMLDoc:xmlDoc] ;<br />	<br />	NSString * imgName = [self getStringFromXquery:@&quot;/infosheet/image/name&quot; fromXMLDoc:xmlDoc] ;<br />	<br />	UIImage * myImage = [[[UIImage alloc] initWithContentsOfFile: [mainBundle pathForResource:imgName ofType:@&quot;png&quot;]] 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:&amp;err]; <br />	<br />	if ([nodes count] &gt; 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 />

Réponses

  • NoNo Membre
    07:18 modifié #2
    NSXMLDocument n'est pas implanté dans Iphone, pour des raisons de performance, à  ce que l'on dit...
    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.
  • yodarkyodark Membre
    07:18 modifié #3
    Le simulateur iPhone n'implémente pas les mêmes classes que l'iPhone ? c'est pas très pratique ca...
  • AliGatorAliGator Membre, Modérateur
    décembre 2008 modifié #4
    Ben en fait pas tout à  fait.
    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 :
    The Foundation framework provides support for XML parsing through the NSXMLParser class. However, other XML parsing classes (including NSXMLDocument, NSXMLNode, and NSXMLElement) are not available in iPhone OS. In addition to the NSXMLParser class, you can also use the libXML2 library, which provides a C-based XML parsing interface.
    (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...
  • NoNo Membre
    07:18 modifié #5
    dans 1229508003:

    Le simulateur iPhone n'implémente pas les mêmes classes que l'iPhone ? c'est pas très pratique ca...

    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.
Connectez-vous ou Inscrivez-vous pour répondre.