0

J'utilise une instance de NSXMLParser. Je stocke les caractères trouvés dans NSMutableStrings qui sont stockés dans un NSMutableDictionary et ces Dicts sont ensuite ajoutés à un NSMutableArray.Passant la valeur NULL

Quand je teste cela, tout semble normal: je compte 1 tableau, x dictionnaires et x chaînes.

Dans un fichier de contrôleur de détail, je souhaite afficher mes résultats analysés. J'appelle la classe où tout est stocké mais je reçois (null) retourné.

C'est ce que je fais (mal):

xAppDelegate.h 

@interface xAppDelegate : NSObject <UIApplicationDelegate> {  
    UIWindow *window; 
    UINavigationController *navigationController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

@end 

xAppDelegate.m 

#import "xAppDelegate.h" 
#import "RootViewController.h" 
#import "XMLParser.h" 

@implementation xAppDelegate 
@synthesize window, navigationController; 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // OFFLINE DOCUMENT > Resources folder 
    NSString *Path = [[NSBundle mainBundle] bundlePath]; 
    NSString *DataPath = [Path stringByAppendingPathComponent:@"file.xml"]; 
    NSData *Data = [[NSData alloc] initWithContentsOfFile:DataPath]; 

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:Data];  

    XMLParser *parser = [[XMLParser alloc] initXMLParser]; 

    [xmlParser setDelegate:parser]; 
    [xmlParser setShouldProcessNamespaces:NO]; 
    [xmlParser setShouldReportNamespacePrefixes:NO]; 
    [xmlParser setShouldResolveExternalEntities:NO]; 

    [xmlParser parse];  

    [window addSubview: navigationController.view]; 
    [window makeKeyAndVisible]; 
} 

- (void)dealloc { 
    [window release]; 
    [navigationController release]; 
    [super dealloc]; 
} 
@end 

    XMLParser.h 
@class xAppDelegate; 

    @interface XMLParser : NSObject { 
     NSMutableArray *array; 
     NSMUtableDictionary *dictionary; 
     NSSMutabletring *element; 
xAppDelegate *appDelegate; 
    } 
- (XMLParser *) initXMLParser; 
    @property (nonatomic, retain) NSMutableArray *array; 
    @property (nonatomic, retain) NSMutableDictionary *dictionary; 
    @property (nonatomic, retain) NSMutableString *element; 


    XMLParser.m 
#import "xAppDelegate.h" 
#import "XMLParser.h" 

    @synthesize array, dictionary, element; 
- (XMLParser *) initXMLParser { 
[super init]; 
appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate]; 

return self;  
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    array = [[NSMutableArray alloc] init]; 
     dictionary = [[NSMutableDictionary alloc] init]; 
} 

    - (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict 
{ 
    ele = [elementName copy]; 
    if ([elementName isEqualToString:@"CONTAINER"]) { 
     element = [[NSMutableString alloc] init]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser 
foundCharacters:(NSMutableString *)string 
{ 
    if ([ele isEqualToString:@"ELEMENTNAME"]) { 
     [element appendString:string]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"CONTAINER"]) { 
     [dictionary setObject:element forKey:@"ELEMENTNAME"]; 
     [array addObject:[dictionary copy]]; 
     } 
} 
- (void) dealloc { 
[element release]; 
[dictionary release]; 
[array release]; 
} 

Dans mon fichier du contrôleur que je fais ceci:

controller.h 
@class XMLParser; 

@interface controller : UIViewController { 
XMLParser *aXMLParser; 
} 

@property (nonatomic, retain) XMLParser *aXMLParser; 

controller.m 
#import "XMLParser.h" 

@synthesize aXMLParser; 

- (void)viewDidLoad { 
    NSLog(@"test array: %@", aXMLParser.array); 
    NSLog(@"test dict: %@", aXMLParser.dictionary); 
    NSLog(@"test element: %@", aXMLParser.element); 
} 

Lorsque je teste la valeur de mon tableau, un dict ou un élément le fichier XMLParser.h j'obtiens mon résultat. Qu'est-ce que je fais de mal donc je ne peux pas appeler mes résultats dans mon fichier de contrôleur? Toute aide est la bienvenue, car je suis bloqué en ce moment:/

+0

Ceci est Objective-C. – BobbyShaftoe

+0

Merci de remarquer que BobbyShaftoe. – FFXIII

Répondre

0

Vous n'avez probablement pas initialisé l'élément NSMutableString, donc vous envoyez probablement des messages à un objet nul.

C'est une supposition parce que vous n'avez pas posté le code important. Nous devons voir

  • où vous les trois objets initialisez
  • où vous les attribuez par exemple vous pourriez assigner zéro à l'un d'entre eux sans le savoir.

édité après le dernier morceau de code

Il y a beaucoup de mal avec le code, par exemple, il fuit beaucoup d'objets, mais je ne vois rien qui causerait votre problème spécifique , sauf si les éléments ELEMENTNAME n'apparaissent pas dans les éléments CONTAINER de votre fichier XML.

Je ne suis pas un expert sur le code d'interface utilisateur sur iPhone, mais êtes-vous sûr que l'applicationDidFinishLaunching s'exécute avant viewDidLoad? De plus, vous ne semblez jamais assigner votre analyseur à la propriété aXMLParser.

Certaines des autres questions

Vos fuites NSXMLParser parce que vous ne relâchez pas.

Votre propre analyseur fuit également pour la même raison (vous voulez probablement utiliser aXMLParser, pas un fichier défini localement).

Votre méthode initXMPLarser devrait ressembler à:

- (XMLParser *) initXMLParser { 
    self = [super init]; 
    if (self != nil) 
    { 
     appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    } 

    return self;  
} 

à savoir ne pas jeter le résultat de [super init] et assurez-vous qu'il est non nul.

est attribué chaque fois que vous frappez un nouvel élément. Chaque tilme que vous frappez un nouvel élément, vous jetez et fuyez le tableau précédent du dernier élément.

Le dictionnaire est attribué chaque fois que vous frappez un élément CONTAINER. Vous devriez au moins libérer l'ancien avant d'allouer le nouveau.

élément fuit également.

La copie du dictionnaire que vous avez insérée dans la matrice présente également des fuites. Les collections Objective-C conservent leurs éléments.

+0

Si l'une des chaînes est affectée, rien ne fonctionnera? J'ai beaucoup d'espaces blancs et de nouvelles lignes etc, mais la fonction foundIgnorableWhitespace automatique ne s'occupe-t-elle pas de cela? Thx pour votre réponse – FFXIII

+0

@FFXIII: pouvez-vous modifier votre question pour inclure ce nouveau code? Cela rendra le formatage plus clair. Je ne suis pas sûr à propos de foundIgnorableWhateSpace: Pas tout le temps que l'espace dans un élément est ignorable. – JeremyP

+0

Alors, où invoquez-vous réellement une opération d'analyse avec votre analyseur XML? – JeremyP