2011-02-26 49 views
3

是否有在Objective-C库,我可以在IPhone使用,其中我可以提前告诉大家,这些标签应该期望图书馆在XML文件中,然后该库自动解析它我,给我的NSDictionary阵列回报或类似的东西?自动解析库在Objective-C - [自动化XML/JSON转换成对象]

简单地说,我要寻找它给我的“对象”的数组它有后自动解析XML文档,我可以决定了对象,它应该从文档中提取属性的东西。

我要寻找一个在Objective-C的一些类似的 http://code.google.com/p/google-gson/

回答

0

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

+0

我使用它,但这是非常“驴”的工作。我在想一些可以自动为我解析的东西,而不是我必须手动完成。 – itsaboutcode 2011-02-26 03:19:57

0

我希望这回答了你的问题,或给你一些洞察你如何的形式给出问题。您需要一种简单的方法将您的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