J'espère que cela répond à votre question, ou vous donner un aperçu de la façon dont vous pouvez aborder le problème. Vous voulez un moyen simple de convertir vos données XML en classes typées fortes. Voici comment je convertis un document XMLdata en un objet Objective-C appelé RSSDataItem. La méthode XMLParser, parseData prend votre NSData de votre Url (donc son bytedata). J'ai deux méthodes dans mon protocole (délégué).
mon interface XMLParser (XMLParser.h)
@interface XMLParser : NSObject <NSXMLParserDelegate>
{
BOOL fStoreCharacters;
NSXMLParser *parser;
NSMutableString *currentData;
RSSDataItem *currentItem;
}
- (void)parseData:(NSData*)data;
@property (assign) id <XMLParserDoneDelegate> delegate;
@end
Voici le protocole (méthodes de délégué).
@protocol XMLParserDoneDelegate <NSObject>
- (void)itemParsed:(id)item; //one item parsed, tell delegate
- (void)parseDone; //we are done with all our data. Reload dataTable or what you want.
@end
MON fichier de mise en œuvre (* .m)
#import "XMLParser.h"
@implementation XMLParser
@synthesize delegate;
- (void)parseData:(NSData*)data
{
[parser abortParsing];
[parser release], parser = nil;
parser = [[NSXMLParser alloc] initWithData:data];
[parser setShouldProcessNamespaces:NO]; // We don't care about namespaces
[parser setShouldReportNamespacePrefixes:NO]; //
[parser setShouldResolveExternalEntities:NO]; // We just want data, no other stuff
[parser setDelegate:self];
[parser parse];
}
- (void)dealloc {
delegate = nil;
[currentItem release], currentItem = nil;
[currentData release], currentData = nil;
[parser abortParsing];
[parser release], parser = nil;
[super dealloc];
}
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"item"])
{
currentItem = [[RSSDataItem alloc] init];
}
else if ([elementName isEqualToString:@"title"]||
[elementName isEqualToString:@"link"] ||
[elementName isEqualToString:@"guid"] ||
[elementName isEqualToString:@"description"] ||
[elementName isEqualToString:@"pubDate"])
{
[currentData setString:@""];
fStoreCharacters = YES;
}
}
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"item"])
{
if ([delegate respondsToSelector:@selector(itemParsed:)])
{
[delegate itemParsed:currentItem];
}
[currentItem release], currentItem = nil;
}
else
{
[currentItem setValue:currentData
forKey:elementName];
}
fStoreCharacters = NO;
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
if (parseError != nil){
NSLog(@"NSXMLParser: %@", [parseError localizedDescription]);
}
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (fStoreCharacters)
{
[currentData appendString:string];
}
}
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
currentData = [[NSMutableString alloc] init];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
if ([delegate respondsToSelector:@selector(parseDone)])
[delegate parseDone];
}
@end
Je l'utilise mais c'est un travail très "âne". Je pensais quelque chose qui peut faire l'analyse automatiquement pour moi au lieu de le faire manuellement. – itsaboutcode