我正試圖將XML解析爲json格式。我使用XMLReader第三方庫(從Github下載)。解析XML後,我得到NULL結果。 我試圖打印出錯的NSError值是「NSErrorDomain code = 4,Document is Empty」。我能做什麼?任何人都可以幫助嗎?解析後的XMLParser在字典中給出NULL值
這裏是我的viewDidLoad()代碼:
NSDictionary *xmlDict = [[NSDictionary alloc]init]; NSError *parseError = nil; xmlDict = [XMLReader dictionaryForXMLString:@"abc.xml"]; // which call's the XMLReader Class Method NSLog(@"MAIN CLASS OF Dictionary: %@",xmlDict); // Gives the NULL Results.
這是我XMLReader.h代碼
#import <Foundation/Foundation.h> @interface XMLReader : NSObject <NSXMLParserDelegate> { NSMutableArray *dictionaryStack; NSMutableString *textInProgress; NSError *errorPointer; } + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer; + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer; @end
這是我的XMLReader。 m代碼
#import "XMLReader.h" 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]; return rootDictionary; } + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error { NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; return [XMLReader dictionaryForXMLData:data error:error]; } #pragma mark Parsing - (NSDictionary *)objectWithData:(NSData *)data { // Clear out any old data 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 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 = [[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; NSLog(@"ERROR PONIT IS: %@",errorPointer); } @end
所以,在這段代碼中我使用XML數據解析字典格式。任何人都可以幫助我解決這個問題嗎?
你得到錯誤,因爲你需要傳遞XML字符串而不是你的ur湖 –
感謝Replay Nirav。你能解釋如何在這段代碼中使用XML網址嗎? – sarosar