【问题标题】:Automatic parsing library in objective-c - [Automated XML/JSON to Object Conversion]Objective-c 中的自动解析库 - [自动 XML/JSON 到对象转换]
【发布时间】:2011-02-26 03:15:11
【问题描述】:

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

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

我正在 Objective-C 中寻找类似的东西 http://code.google.com/p/google-gson/

【问题讨论】:

    标签: objective-c xml cocoa-touch parsing ios


    【解决方案1】:

    虽然这个问题是一年多前提出的,但我添加了我自己的库,获得了许可 MIT 许可证正是我们正在寻找的:

    http://ceasyxml.googlecode.com/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我正在使用它,但它是非常“驴”的工作。我在想一些可以自动为我解析的东西,而不是我必须手动完成。
      【解决方案3】:

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

      我的 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
      

      【讨论】:

        【解决方案4】:

        TouchXML 易于使用。 TouchXML QuickQuide

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-04
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          • 1970-01-01
          相关资源
          最近更新 更多