objective-c中的自动解析库 –
在Objective-C中是否有一个我可以在IPhone中使用的库,其中我可以事先告诉库它应该在xml文件中预期这些标签,然后该库自动为我解析它并给我一个NSDictionary数组作为回报或类似的东西?
简单来说,我正在寻找一些东西,它在自动解析xml文档之后给了我一个“对象”数组,我可以指示它应该从文档中提取的那个对象的属性。
我在Objective-C中寻找与此相似的内容http://code.google.com/p/google-gson/
虽然这个问题是在一年多前提出的,但我在MIT许可下添加了我自己的图书馆,这完全符合我们的要求:
您应该查看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
- UIManagedDocument NSFetchedResultsController和背景上下文
- Facebook SDKlogin对话框出现两次
- .aifaudio文件转换的kAudioFormat?
- UIDatePicker设置最小和最大小时
- 在iOS上为NSFileManager获得root权限(越狱)
- 核心animation中的圆形箭头蒙版的长度的animation
- 订阅ReactiveCocoa中的networking电话信号的正确select是什么?
- 为什么在调用popViewControllerAnimated时ARC不释放内存
- UIWebView的委托方法shouldStartLoadWithRequest:相当于WKWebView?