2011-02-26 2 views
3

Existe-t-il une bibliothèque en Objective-C que je peux utiliser dans IPhone, dans laquelle je peux dire à l'avance la bibliothèque que ces balises devraient dans le fichier XML, puis cette bibliothèque l'analyser automatiquement pour moi et me donner un tableau de NSDictionary en retour ou quelque chose de similaire? En termes simples, je cherche quelque chose qui me donne un tableau de "Object" après avoir analysé le document xml automatiquement et je peux dicter les attributs de cet objet qu'il devrait extraire du document.Bibliothèque d'analyse automatique dans Objective-C - [Automated XML/JSON à Object Conversion]

Je cherche quelque chose de similaire à ce en Objective-C http://code.google.com/p/google-gson/

Répondre

0

Vous devriez jeter un oeil à NSXMLParser et son protocole de délégué, NSXMLParserDelegate. Ce n'est pas aussi simple que ce que vous avez décrit mais pas trop difficile à mettre en œuvre non plus.

+0

Je l'utilise mais c'est un travail très "âne". Je pensais quelque chose qui peut faire l'analyse automatiquement pour moi au lieu de le faire manuellement. – itsaboutcode

0

J'espère que cela répond à votre question, ou vous donner un aperçu de la façon dont vous pouvez aborder le problème. Vous voulez un moyen simple de convertir vos données XML en classes typées fortes. Voici comment je convertis un document XMLdata en un objet Objective-C appelé RSSDataItem. La méthode XMLParser, parseData prend votre NSData de votre Url (donc son bytedata). J'ai deux méthodes dans mon protocole (délégué).

mon interface 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 

Voici le protocole (méthodes de délégué).

@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 

MON fichier de mise en œuvre (* .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 
1

Bien que cette question a été posée plus d'un an, j'ajouter ma propre bibliothèque sous licence la licence MIT qui fait exactement ce que nous recherchons:

http://ceasyxml.googlecode.com/