2012-03-29 2 views
1

Grundsätzlich möchte ich eine Klasse zum Parsen von XML-Dokument für meine iPhone-Apps schreiben.Ist es möglich, ein Array von 'Super Class'-Objekten in einer Klasse zu haben?

Hier ist meine Header-Datei für den Parser, die einem News-Feed

@interface NewsXML : NSObject<NSXMLParserDelegate> 
{ 
@private 
    NSXMLParser *xmlParser; 

    NSString *currentElement; 
    NSMutableString *currentTitle; 
    NSMutableString *currentDate; 
    NSMutableString *currentDetail; 
    NSMutableString *currentImageURL; 
    NSMutableString *currentThumbnailURL; 
    NSMutableString *currentAlt; 
} 

@property (nonatomic, assign) NSObject<NewsXMLDelegate> *delegate; 
@property (nonatomic, strong) NSMutableArray *newsItems; 
@property (nonatomic, strong) NSURL *url; 

- (void)fetch; 

@end 

Es gibt eine Reihe ‚Nachrichtenmeldungen“, die die abgerufenen Objekte aus dem XML nach der Methode hält ‚holen‘ genannt wird analysiert.

.

Allerdings gibt es verschiedene Arten von XML-Dateien in meinem Programm, das ich analysieren möchte Jede Art von XML-Datei haben unterschiedliche Felder (zB: Titel, Datum, Detail, etc.).

ich schaffe andere Klasse (zB NewsItem, FooItem, AbcItem) zum Halten der Items f aus verschiedenen XML-Dateien.

Ich kann immer noch nicht herausfinden, wie diese XML-Parser-Klasse allgemeiner zu machen, so dass die NSMutableArray von Elementen verschiedene Arten von Elementen (NewsItem, FooItem ..) für jeden Fall enthalten kann. Jetzt muss ich verschiedene XML-Parser-Klassen für jede XML-Datei schreiben.

Also, wie kann das auf eine allgemeinere Weise getan werden?

EDIT

Es tut sie unklar zu sein .. Wenn die Parser jedes Element analysieren, es wird die zum Halten von Daten, und fügen Sie dann in das Array ein neues Objekt wie ‚NewsItem‘, ‚FooItem‘ erstellen. Allerdings sollte die Parser-Klasse die Existenz dieser Klassen nicht kennen (Da immer mehr Item-Klasse später hinzugefügt wird). Wie kann dann diese XML-Parser-Klasse die richtigen Objekte erstellen und sie dem Array richtig hinzufügen? Gibt es eine Möglichkeit, die Parser-Klasse mit der Klasse des Elements zu initialisieren?

+0

Nicht ganz klar, was Sie fragen. Sie können nach (id) umwandeln und die Klassenmethode verwenden, um zu sehen, welche Klasse tatsächlich vorhanden ist, und mutableArrays können gemischte Typen enthalten. Hilft einer dieser Fakten? –

+0

Entschuldigung für Unklarheiten. Wenn der Parser jedes Element analysiert, wird ein neues Objekt wie "NewsItem", "FooItem" zum Speichern der Daten erstellt und dann zum Array hinzugefügt. Allerdings sollte die Parser-Klasse die Existenz dieser Klassen nicht kennen (Da immer mehr Item-Klasse später hinzugefügt wird). Wie kann dann diese XML-Parser-Klasse die richtigen Objekte erstellen und sie dem Array richtig hinzufügen? Gibt es eine Möglichkeit, die Parser-Klasse mit der Klasse des Elements zu initialisieren? – cppcho

Antwort

2

Nach dem Lesen Ihres Kommentars, denke ich nicht, dass, was Sie im Sinn haben, ist ein gutes Design für die Klassen. Ich denke, dass der XML-Parser XML auf einfache Weise parsen sollte und immer die gleiche Sache zurückgibt, und Ihre Klassen (wie NewsItem, FooItem, etc.) sollten wissen, wie sie sich mit der geparsten XML selbst erstellen. Dies ist viel robuster.

Ich mache das in mehreren Apps, die ich gemacht habe. Meine NewsItem oder FooItem Klassen implementieren eine Funktion, die wie folgt aussieht:

- (id)initWithXMLData:(NSDictionary *)xmlDataDictionary { 
    self.fooVar = [xmlDataDictionary [email protected]"xmlParsedKey"]; 
    //And so on for whatever you need to set from the xml data 
} 

diese Weise wird die XML-Daten analysiert ist immer das gleiche (Sie nicht den XML-Parser ändern), und wenn Sie die Klasse müssen die Daten unterschiedlich zu handhaben, Sie ändern die eigene initWithXMLData-Funktion der Klasse, anstatt den XML-Parser zu ändern. Der XML-Parser muss nie über die Existenz anderer Klassen wissen.

+1

Hochgezählt, da dies der Ansatz ist, den ich immer in meinen Projekten verwende, wenn ich Objekte aus JSON- oder HTML-Daten erzeuge. –

+0

Vielen Dank. Ich versuche jetzt, meine Parser-Klasse neu zu schreiben, um jetzt ein Array von NSDictionary anstelle eines Arrays von spezifischen Objekten zurückzugeben. – cppcho

Verwandte Themen