Woo! Hooy!
We have just recieved your project brief and our expert will contact you shortly.
Send Again
Close
If you want to parse XML data into NSDictionary without using XML parser and its delegate method. You can use the XMLReader class in iOS to parse the XML into the NSDictionary. Here is the method of XMLReader class by which you can parse the XMLÂ into the NSDictionary.And also you can see the XML string.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
theXML =[NSString stringWithFormat:@"<prestashop xmlns=\"http://www.w3.org/1999/xlink\">" "<address>" "<id_customer>%@</id_customer>" "<active>1</active>" "<id>%@</id>" "<company>Webkul</company>" "<id_country>%@</id_country>" "<firstname>%@</firstname>" "<lastname>%@</lastname>" "<address1>%@</address1>" "<address2>%@</address2>" "<city>%@</city>" "<postcode>%@</postcode>" "<phone_mobile>%@</phone_mobile>" "<phone>%@</phone>" "<alias>%@</alias>" "<other>%@</other>" "</address>" "</prestashop>"@"20",@"56",@"ram",...........]; |
1 |
xmlDictionary = [XMLReader dictionaryForXMLString:theXML error:nil]; |
XMLReader.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// // XMLReader.h // // Created by Troy Brant on 9/18/10. // Updated by Antoine Marcadet on 9/23/11. // Updated by Divan Visagie on 2012-08-26 // #import <Foundation/Foundation.h> enum { XMLReaderOptionsProcessNamespaces = 1 << 0, // Specifies whether the receiver reports the namespace and the qualified name of an element. XMLReaderOptionsReportNamespacePrefixes = 1 << 1, // Specifies whether the receiver reports the scope of namespace declarations. XMLReaderOptionsResolveExternalEntities = 1 << 2, // Specifies whether the receiver reports declarations of external entities. }; typedef NSUInteger XMLReaderOptions; @interface XMLReader : NSObject <NSXMLParserDelegate> + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer; + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer; + (NSDictionary *)dictionaryForXMLData:(NSData *)data options:(XMLReaderOptions)options error:(NSError **)errorPointer; + (NSDictionary *)dictionaryForXMLString:(NSString *)string options:(XMLReaderOptions)options error:(NSError **)errorPointer; @end |
XMLReader.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
// // XMLReader.m // // Created by Troy Brant on 9/18/10. // Updated by Antoine Marcadet on 9/23/11. // Updated by Divan Visagie on 2012-08-26 // #import "XMLReader.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "XMLReader requires ARC support." #endif NSString *const kXMLReaderTextNodeKey = @"text"; NSString *const kXMLReaderAttributePrefix = @"@"; @interface XMLReader () @property (nonatomic, strong) NSMutableArray *dictionaryStack; @property (nonatomic, strong) NSMutableString *textInProgress; @property (nonatomic, strong) NSError *errorPointer; @end @implementation XMLReader #pragma mark - Public methods + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error { XMLReader *reader = [[XMLReader alloc] initWithError:error]; NSDictionary *rootDictionary = [reader objectWithData:data options:0]; return rootDictionary; } + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error { NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; return [XMLReader dictionaryForXMLData:data error:error]; } + (NSDictionary *)dictionaryForXMLData:(NSData *)data options:(XMLReaderOptions)options error:(NSError **)error { XMLReader *reader = [[XMLReader alloc] initWithError:error]; NSDictionary *rootDictionary = [reader objectWithData:data options:options]; return rootDictionary; } + (NSDictionary *)dictionaryForXMLString:(NSString *)string options:(XMLReaderOptions)options error:(NSError **)error { NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; return [XMLReader dictionaryForXMLData:data options:options error:error]; } #pragma mark - Parsing - (id)initWithError:(NSError **)error { self = [super init]; if (self) { // self.errorPointer = *error; } return self; } - (NSDictionary *)objectWithData:(NSData *)data options:(XMLReaderOptions)options { // Clear out any old data self.dictionaryStack = [[NSMutableArray alloc] init]; self.textInProgress = [[NSMutableString alloc] init]; // Initialize the stack with a fresh dictionary [self.dictionaryStack addObject:[NSMutableDictionary dictionary]]; // Parse the XML NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; [parser setShouldProcessNamespaces:(options & XMLReaderOptionsProcessNamespaces)]; [parser setShouldReportNamespacePrefixes:(options & XMLReaderOptionsReportNamespacePrefixes)]; [parser setShouldResolveExternalEntities:(options & XMLReaderOptionsResolveExternalEntities)]; parser.delegate = self; BOOL success = [parser parse]; // Return the stack's root dictionary on success if (success) { NSDictionary *resultDict = [self.dictionaryStack objectAtIndex:0]; return resultDict; } return nil; } #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 = [self.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 [self.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 = [self.dictionaryStack lastObject]; // Set the text property if ([self.textInProgress length] > 0) { // trim after concatenating NSString *trimmedString = [self.textInProgress stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; [dictInProgress setObject:[trimmedString mutableCopy] forKey:kXMLReaderTextNodeKey]; // Reset the text self.textInProgress = [[NSMutableString alloc] init]; } // Pop the current dict [self.dictionaryStack removeLastObject]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // Build the text value [self.textInProgress appendString:string]; } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { // Set the error pointer to the parser's error object self.errorPointer = parseError; } @end |
Be the first to comment.