Библиотека автоматического анализа в target-c - [Автоматическое преобразование XML / JSON в объекты] - PullRequest
3 голосов
/ 26 февраля 2011

Есть ли библиотека в Objective-C, которую я могу использовать в IPhone, в которой я могу заранее сказать библиотеке, что эти теги следует ожидать в файле XML, а затем эта библиотека автоматически проанализирует ее для меня и даст мнемассив NSDictionary взамен или что-то подобное?

Проще говоря, я ищу что-то, что дает мне массив «Объект» после того, как он автоматически анализирует документ XML, и я могу диктовать атрибуты этого объекта, которыеего следует извлечь из документа.

Я ищу что-то похожее в Objective-C http://code.google.com/p/google-gson/

Ответы [ 4 ]

1 голос
/ 21 мая 2012

Хотя этот вопрос был задан более года назад, я добавляю свою собственную библиотеку под лицензией лицензия MIT, которая делает именно то, что мы ищем:

http://ceasyxml.googlecode.com/

0 голосов
/ 26 февраля 2011

Я надеюсь, что это ответит на ваш вопрос, или даст вам некоторое представление о том, как вы можете решить проблему.Вы хотите простой способ преобразовать ваши данные XML в строго типизированные классы.Вот как я преобразовываю документ XMLdata в элемент Objective C под названием RSSDataItem.Метод XMLParser, parseData, берет ваши NSData из вашего URL (то есть его 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

Файл MY (* .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
0 голосов
/ 26 февраля 2011

TouchXML прост в использовании. TouchXML QuickQuide

0 голосов
/ 26 февраля 2011

Вы должны взглянуть на NSXMLParser и его протокол делегата, NSXMLParserDelegate.Это не так просто, как вы описали, но не слишком сложно для реализации.

...