2010-12-08 3 views
0

Ich brauche Hilfe beim Parsen einer XML-Datei. Mein Problem ist, dass ich nicht weiß, wie man den Delegierten didEndElement implementiert.
Was ich will ist, dass ich 2 Zellen haben werde, wo das Alte Testament und das Neue Testament ausgestellt werden und dann die Bücher der Bibel und die Kapitel. Wenn ich nur Hilfe mit dem XML-Parsing bekommen kann, kann ich den Rest verwalten.iPhone - Parsing XML-Datei - Bitte helfen!

Wir sind sehr dankbar für jede Hilfe!

Danke und Gruß!

Meine XML-Datei ist wie folgt:

<?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 


Es folgt die Ausgabe von der Debugger-Konsole:

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

Rollen Sie meine Änderungen nicht wieder zurück –

+0

Willkommen bei Stack Overflow. Diese Frage ist vollständig und völlig unlesbar. Bitte benutzen Sie die Schaltfläche "101010", um Ihren Code zu formatieren, und überprüfen Sie die Vorschau, bevor Sie auf den Post klicken. Wenn Sie es nicht lesen können, wie können wir es lesen? –

+0

Ich reparierte es für ihn –

Antwort

0

Sie sind bereits es Parsen. In dem didEndElement: Aufruf, tun Sie einfach, was auch immer Sie mit dem Element tun möchten. Da Ihr XML keine umschlossenen Strings enthält (Sie verwenden nicht foundCharacters:), müssen Sie nur auf didStartElement: und didEndElement: entsprechend reagieren. Wenn Sie Attribute erfassen oder eine neue Datenstruktur zuweisen müssen, um mögliche Kinder zu halten, tun Sie es in didStartElement:. Wenn Sie Objekte in Sammlungen speichern oder die Bearbeitung eines bestimmten Elements beenden müssen, tun Sie dies in didEndElement:.

Bei dieser Frage geht es nicht wirklich um das Parsen, sondern darum, welche Logik Sie als Antwort auf das Parsing ausführen möchten.

bearbeiten als Antwort unten Kommentar:

ich normalerweise die folgenden Objekte während der Analyse zu sparen: in meiner Schnittstelle, erkläre ich die Sammlung Ich brauche Objekte in und ein temporäres Objekt zu speichern, die ich verwenden was auch immer Daten zu halten, wir müssen, bevor es zu der Sammlung hinzugefügt, wie diese

bei der Implementierung manipuliere ich diese beiden Objekte, die typischerweise in didStartDocument:, didStartElement: und didEndElement:, etwa so:

- (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; 
} 

Dann tun Sie, was Sie mit dem Sammelobjekt tun werden. Stellen Sie sicher, dass Sie Speicherobjekte behandeln, wie das Sammelobjekt freigeben oder was auch immer. Ich benutze normalerweise etwas wie einen Delegierten-Callback (meiner eigenen Entwicklung), um die Sammlung zum Modell zu bringen, um das Parsing logisch vom Modell zu trennen.

+0

Hallo Kevboh, ich weiß deine Hilfe zu schätzen. Ich versuche tatsächlich "Objekte in Sammlungen zu speichern". Genau dort stoße ich auf Probleme. Jede Hilfe wäre willkommen. – tssav

+0

sehe meine Bearbeitung, ich habe einige Parsing-Code enthalten. – kevboh

+0

Kevboh, Vielen Dank! Das ist eine große Hilfe für mich! Ich kann es von hier aus schaffen. – tssav