objective-c中的自动解析库 –

在Objective-C中是否有一个我可以在IPhone中使用的库,其中我可以事先告诉库它应该在xml文件中预期这些标签,然后该库自动为我解析它并给我一个NSDictionary数组作为回报或类似的东西?

简单来说,我正在寻找一些东西,它在自动解析xml文档之后给了我一个“对象”数组,我可以指示它应该从文档中提取的那个对象的属性。

我在Objective-C中寻找与此相似的内容http://code.google.com/p/google-gson/

虽然这个问题是在一年多前提出的,但我在MIT许可下添加了我自己的图书馆,这完全符合我们的要求:

http://ceasyxml.googlecode.com/

您应该查看NSXMLParser及其委托协议NSXMLParserDelegate。 它并不像你描述的那么容易,但也不难实现。

我希望这可以回答您的问题,或者让您了解如何解决问题。 您需要一种简单的方法将XML数据转换为强类型类。 以下是将XMLdata文档转换为名为RSSDataItem的Objective-C项的方法。 XMLParser方法,parseData从您的Url获取NSData(因此它的bytedata)。 我的协议中有两种方法(委托)。

我的XMLParser接口(XMLParser.h)

@interface XMLParser : NSObject  { BOOL fStoreCharacters; NSXMLParser *parser; NSMutableString *currentData; RSSDataItem *currentItem; } - (void)parseData:(NSData*)data; @property (assign) id  delegate; @end 

这是协议(委托方法)。

 @protocol XMLParserDoneDelegate  - (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 

TouchXML易于使用。 TouchXML QuickQuide