Xml to dictionary parsing using XML reader [closed]

匿名 (未验证) 提交于 2019-12-03 02:54:01

问题:

I want to convert data in to dictionary ,any suggestions..

回答1:

if you are newbie and don't know how to parse xml to dictionary... try with the below methods...

in .h file add this methods

#import <Foundation/Foundation.h>   @interface XMLReader : NSObject {     NSMutableArray *dictionaryStack;     NSMutableString *textInProgress;     NSError **errorPointer; }  + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer; + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer;  @end

and in your .m file parse your URL using these methods.

NSString *const kXMLReaderTextNodeKey = @"text";  @interface XMLReader (Internal)  - (id)initWithError:(NSError **)error; - (NSDictionary *)objectWithData:(NSData *)data;  @end   @implementation XMLReader  #pragma mark - #pragma mark Public methods  + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error {     XMLReader *reader = [[XMLReader alloc] initWithError:error];     NSDictionary *rootDictionary = [reader objectWithData:data];     [reader release];     return rootDictionary; }  + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error {     NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];     return [XMLReader dictionaryForXMLData:data error:error]; }  #pragma mark - #pragma mark Parsing  - (id)initWithError:(NSError **)error {     if (self = [super init])     {         errorPointer = error;     }     return self; }  - (void)dealloc {     [dictionaryStack release];     [textInProgress release];     [super dealloc]; }  - (NSDictionary *)objectWithData:(NSData *)data {     // Clear out any old data     [dictionaryStack release];     [textInProgress release];      dictionaryStack = [[NSMutableArray alloc] init];     textInProgress = [[NSMutableString alloc] init];      // Initialize the stack with a fresh dictionary     [dictionaryStack addObject:[NSMutableDictionary dictionary]];      // Parse the XML     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];     parser.delegate = self;     BOOL success = [parser parse];      // Return the stack's root dictionary on success     if (success)     {         NSDictionary *resultDict = [dictionaryStack objectAtIndex:0];         return resultDict;     }      return nil; }  #pragma mark - #pragma mark NSXMLParserDelegate methods  - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {     // Get the dictionary for the current level in the stack     NSMutableDictionary *parentDict = [dictionaryStack lastObject];      // Create the child dictionary for the new element, and initilaize it with the attributes     NSMutableDictionary *childDict = [NSMutableDictionary dictionary];     [childDict addEntriesFromDictionary:attributeDict];      // If there's already an item for this key, it means we need to create an array     id existingValue = [parentDict objectForKey:elementName];     if (existingValue)     {         NSMutableArray *array = nil;         if ([existingValue isKindOfClass:[NSMutableArray class]])         {             // The array exists, so use it             array = (NSMutableArray *) existingValue;         }         else         {             // Create an array if it doesn't exist             array = [NSMutableArray array];             [array addObject:existingValue];              // Replace the child dictionary with an array of children dictionaries             [parentDict setObject:array forKey:elementName];         }          // Add the new child dictionary to the array         [array addObject:childDict];     }     else     {         // No existing value, so update the dictionary         [parentDict setObject:childDict forKey:elementName];     }      // Update the stack     [dictionaryStack addObject:childDict]; }  - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {     // Update the parent dict with text info     NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];      // Set the text property     if ([textInProgress length] > 0)     {         [dictInProgress setObject:textInProgress forKey:kXMLReaderTextNodeKey];          // Reset the text         [textInProgress release];         textInProgress = [[NSMutableString alloc] init];     }      // Pop the current dict     [dictionaryStack removeLastObject]; }  - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {     // Build the text value     [textInProgress appendString:string]; }  - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {     // Set the error pointer to the parser's error object     *errorPointer = parseError; }  @end

I think this would be helpful to you for parsing the xml data.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!