我希望这回答了你的问题,或给你一些洞察你如何的形式给出问题。您需要一种简单的方法将您的XML数据转换为强类型类。这里是我如何将XMLdata文档转换为名为RSSDataItem的Objective-C项目。 XMLParser方法,parseData从你的Url获取你的NSData(所以它的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
我的执行文件(* .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
我使用它,但这是非常“驴”的工作。我在想一些可以自动为我解析的东西,而不是我必须手动完成。 – itsaboutcode 2011-02-26 03:19:57