2010-10-02 41 views
0

alors là je suis coincé à la partie la plus simple (ou alors je pensais) de mon petit projet pour ce matin. L'objectif était de construire un simple XML Parser qui prend chaque élément qu'ils rencontrent et l'ajoute à un dictionnaire qui finira par contenir toutes les paires clé/valeur du XML.NSMutableDictionary ne prend pas la paire clé/valeur

donc un xml comme celui-ci

<xml> 
    <1stTag>text</1stTag> 
    <2ndTag>some more text</2ndTag> 
</xml> 

finirais dans un dictionnaire avec 2 paires clé/valeur:

{ 
1stTag:text; 
2ndTag:some more text; 
} 

L'adoption du Cadre NSXMLParser je pensais que je venais de stocker tous rencontrés élément et textes dans les variables self.elementInProgress et self.textInProgress (toutes deux NSStrings). Une fois l'élément terminé, j'ajouterais la paire au dictionnaire.

Voici donc le fichier .h:

@interface MSParser : NSObject <NSXMLParserDelegate> 
    { 
     NSString *elementInProgress; 
     NSString *textInProgress; 
     NSMutableDictionary *parsedXMLDict; 
    } 
@property (nonatomic, retain) NSString *textInProgress; 
@property (nonatomic, retain) NSString *elementInProgress; 
@property (nonatomic, retain) NSMutableDictionary *parsedXMLDict; 

Et la fonction correspondante dans le fichier de mise en œuvre:

@synthesize textInProgress, elementInProgress, parsedXMLDict;

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    [self.parsedXMLDict setValue:self.textInProgress forKey:self.elementInProgress]; 
    NSLog(@"%@",[self.parsedXMLDict valueForKey:self.elementInProgress]); 
} 

Maintenant, me voici, perplexe que mon NSLog renvoie Null! Et j'ai pensé que c'était une évidence. Qu'est-ce que je rate? Self.textInProgress et self.elementInProgress sont remplis correctement en fonction du débogueur. Je peux tracer jusqu'à cette ligne où j'appelle setValue ForKey, ce qui est encore selon la documentation et a travaillé plus d'une fois auparavant pour moi. Le dictionnaire ne prend tout simplement pas les valeurs. D'après la documentation, ça ne ferait qu'agir, si le setValue passé était nul, ce qui n'est pas ici ... Des idées?
Tout semble bien, pas les erreurs ou les avertissements du compilateur, il retourne juste Null. Stumped, comme je l'ai dit ...

+0

Avez-vous déjà défini vos valeurs elementInProgress et textInProgress? – Eiko

Répondre

1

Quelque part dans votre code (probablement dans votre méthode init) vous devez instancier une instance de NSMutableDictionary et l'assigner à votre propriété (ou ivar, si vous êtes dans votre méthode init) . Quelque chose comme ceci:

parsedXMLDict = [[NSMutableDictionary alloc] init]; 

Si vous utilisez une construction de commodité qui retourne un objet autoreleased, vous aurez également besoin d'un conserver.

parsedXMLDict = [[NSMutableDictionary dictionaryWithCapacity:10] retain]; 

Dans les deux cas, assurez-vous d'avoir une version correspondante quelque part, probablement dans votre dealloc.

Si vous faites déjà ce qui précède, alors peut-être que vous avez déjà publié parsedXMLDict plus tôt dans votre code? Recherchez les endroits où vous appelez self.parsedXMLDict = nil qui sont appelés avant votre méthode parser: didEndElement: ....

+0

C'était tout. merci un mil! J'aurais dû voir celui-là moi-même. Oh bien .. ;-) Merci encore – karlmeier