2010-12-08 23 views
0

J'ai besoin d'aide pour analyser un fichier XML. Mon problème est que je ne sais pas comment implémenter le délégué de didEndElement.
Ce que je veux, c'est que j'aurai 2 cellules où l'Ancien Testament et le Nouveau Testament seront affichés, puis les Livres de la Bible et les chapitres. Si je peux juste obtenir de l'aide avec le xml l'analyse du reste, je peux gérer.iPhone - Fichier XML d'analyse - S'il vous plaît, aidez!

Seront très reconnaissants pour toute aide!

Merci pour votre intérêt!

Mon fichier xml est la suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<bible> 
<testament name="Old Testament"> 
    <book name="Genesis"> 
    <chapter id="Genesis 1"></chapter> 
    <chapter id="Genesis 2"></chapter> 
    </book> 
    <book name="Exodus"> 
    <chapter id="Exodus 1"></chapter> 
    <chapter id="Exodus 2"></chapter> 
    </book> 
</testament> 
<testament name="New Testament"> 
    <book name="Matthew"> 
    <chapter id="Matthew 1"></chapter> 
    <chapter id="Matthew 2"></chapter> 
    </book> 
    <book name="Revelation"> 
    <chapter id="Revelation 1"></chapter> 
    <chapter id="Revelation 2"></chapter> 
    </book> 
</testament> 
</bible> 

// Bible.h 
#import <Foundation/Foundation.h> 

@interface Bible : NSObject { 
NSMutableArray *bible; 
NSMutableArray *testament; 
NSMutableArray *book; 
NSString *chapterID; 

} 

@property (nonatomic, retain)NSMutableArray *bible; 
@property (nonatomic, retain)NSMutableArray *testament; 
@property (nonatomic, retain)NSMutableArray *book; 
@property (nonatomic, retain)NSString *chapterID; 

@end 

// Bible.m 

#import "Bible.h" 


@implementation Bible 

@synthesize bible; 
@synthesize testament; 
@synthesize book; 
@synthesize chapterID; 

- (void) dealloc { 
[bible release]; 
[testament release]; 
[book release]; 
[chapterID release]; 
[super dealloc]; 
} 

@end 

// 
// XMLParser.h 
// BibleXML 
// 

#import <Foundation/Foundation.h> 
#import "Bible.h" 

@protocol NSXMLParserDelegate; 

@class BibleXMLAppDelegate, Bible; 

@interface XMLParser : NSObject <NSXMLParserDelegate> { 


NSMutableString *currentElementValue; 

BibleXMLAppDelegate *appDelegate; 
Bible *theBible; 

} 

- (XMLParser *) initXMLParser; 

@end 

// 
// XMLParser.m 

#import "XMLParser.h" 
#import "BibleXMLAppDelegate.h" 
#import "Bible.h" 


@implementation XMLParser 

- (XMLParser *) initXMLParser { 

[super init]; 

appDelegate = (BibleXMLAppDelegate *) [[UIApplication sharedApplication] delegate]; 
return self; 
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser{ 
NSLog(@"found file and started parsing"); 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict { 
if([elementName isEqualToString:@"bible"]) { 
    NSLog(@"Found element: %@", elementName); 
    appDelegate.bible = [[NSMutableArray alloc] init]; 
} 

else if([elementName isEqualToString:@"testament"]) { 

    theBible = [[Bible alloc] init]; 
    //Extract the attribute here. 
    theBible.testament = [attributeDict valueForKey:@"name"]; 
    NSLog(@"Testament: %@", theBible.testament); 
    return; 
} 

else if ([elementName isEqualToString:@"book"]) 
{ 
    theBible.book = [attributeDict valueForKey:@"name"]; 
    NSLog(@"Book: %@", theBible.book); 
    return; 
} 

else if([elementName isEqualToString:@"chapter"]) 
{ 
    theBible.chapterID =[attributeDict objectForKey:@"id"]; 
    NSLog(@"Chapter: %@", theBible.chapterID); 
    return; 
} 
} 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
if([elementName isEqualToString:@"bible"]){ 
    return; 
} 

} 


- (void) dealloc { 
[theBible release]; 
[currentElementValue release]; 
[super dealloc]; 
} 

@end 

Après la sortie est de la console de débogage:

2010-12-08 19:53:10.101 BibleXML[25641:207] found file and started parsing 
2010-12-08 19:53:10.102 BibleXML[25641:207] Found element: bible 
2010-12-08 19:53:10.103 BibleXML[25641:207] Testament: Old Testament 
2010-12-08 19:53:10.103 BibleXML[25641:207] Book: Genesis 
2010-12-08 19:53:10.104 BibleXML[25641:207] Chapter: Genesis 1 
2010-12-08 19:53:10.104 BibleXML[25641:207] Chapter: Genesis 2 
2010-12-08 19:53:10.105 BibleXML[25641:207] Book: Exodus 
2010-12-08 19:53:10.105 BibleXML[25641:207] Chapter: Exodus 1 
2010-12-08 19:53:10.106 BibleXML[25641:207] Chapter: Exodus 2 
2010-12-08 19:53:10.107 BibleXML[25641:207] Testament: New Testament 
2010-12-08 19:53:10.107 BibleXML[25641:207] Book: Matthew 
2010-12-08 19:53:10.108 BibleXML[25641:207] Chapter: Matthew 1 
2010-12-08 19:53:10.108 BibleXML[25641:207] Chapter: Matthew 2 
2010-12-08 19:53:10.109 BibleXML[25641:207] Book: Revelation 
2010-12-08 19:53:10.109 BibleXML[25641:207] Chapter: Revelation 1 
2010-12-08 19:53:10.110 BibleXML[25641:207] Chapter: Revelation 2 
2010-12-08 19:53:10.110 BibleXML[25641:207] No Errors 
+0

Ne pas annuler à nouveau mes modifications –

+0

Bienvenue dans Stack Overflow. Cette question est complètement et totalement illisible. Veuillez utiliser le bouton "101010" pour formater votre code, et vérifiez l'aperçu avant de cliquer. Si vous ne pouvez pas le lire, comment pouvons-nous le lire? –

+0

Je l'ai arrangé pour lui –

Répondre

0

Vous l'analyse syntaxique déjà. Dans l'appel didEndElement:, faites simplement ce que vous voulez faire avec l'élément. Puisque votre XML ne contient aucune chaîne encapsulée (vous n'utilisez pas foundCharacters:), tout ce que vous avez à faire est de répondre à didStartElement: et didEndElement: en conséquence. Si vous devez capturer des attributs ou allouer une nouvelle structure de données pour contenir des enfants possibles, faites-le au didStartElement:. Si vous devez enregistrer des objets dans des collections ou terminer le traitement d'un élément particulier, faites-le au didEndElement:.

Cette question ne porte pas vraiment sur l'analyse, mais sur la logique que vous voulez adopter en réponse à l'analyse syntaxique.

Modifier en réponse au commentaire ci-dessous:

En général, j'effectuer les opérations suivantes pour enregistrer sur les objets lors de l'analyse syntaxique: dans mon interface, je déclare la collection que je dois enregistrer des objets dans et un objet temporaire que je de tenir toutes les données que je dois avant de l'ajouter à la collection, comme celui-ci

dans la mise en œuvre de ces deux je manipule des objets, généralement en didStartDocument:, didStartElement: et didEndElement:, comme ceci:

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

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    //if your object is tied to a tag that wraps text (delivered in foundCharacters:), initialize it here 
    tempObject_ = [[SomeObject alloc] init]; 
    //maybe you need the attributes.... 
    tempObject_.someProperty = [attributes objectForKey:@"attribute-name"]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    //when the tag ends, you can save it off into the collection 
    [collection_ addObject:tempObject_]; 
    [tempObject_ release]; 
    tempObject_ = nil; 
} 

Ensuite, faites ce que vous voulez avec l'objet de collection. Assurez-vous de gérer les éléments de la mémoire, comme libérer l'objet de collection ou autre chose. J'utilise habituellement quelque chose comme un rappel de délégué (de ma propre conception) pour obtenir la collection au modèle, afin de séparer logiquement l'analyse du modèle.

+0

Salut Kevboh, j'apprécie votre aide avec ceci. En fait, j'essaie de «sauvegarder des objets dans des collections». C'est juste là où je rencontre des problèmes. Toute aide serait appréciée. – tssav

+0

voir mon édition, j'ai inclus un code d'analyse. – kevboh

+0

Kevboh, merci beaucoup! C'est une grande aide pour moi! Je peux gérer à partir d'ici. – tssav