Я надеюсь, что это ответит на ваш вопрос, или даст вам некоторое представление о том, как вы можете решить проблему.Вы хотите простой способ преобразовать ваши данные XML в строго типизированные классы.Вот как я преобразовываю документ XMLdata в элемент Objective C под названием RSSDataItem.Метод XMLParser, parseData, берет ваши NSData из вашего URL (то есть его bytedata).У меня есть два метода в моем протоколе (делегат).
мой интерфейс 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
Вот протокол (методы делегирования).
@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
Файл MY (* .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