Ich versuche, die XML zu JSON-Format zu analysieren. Ich benutze die externe Bibliothek von XMLReader (die von Github heruntergeladen wurde). Nach dem Parsen des XML bekomme ich die NULL Ergebnisse. Ich habe versucht, die NSError-Werte zu drucken, die den Fehler gibt "NSErrorDomain-Code = 4 und Dokument ist leer". Was kann ich tun? Kann jemand dazu beitragen?XMLParser nach der Analyse gibt NULL-Werte im Wörterbuch
Hier ist mein ViewDidLoad() Code:
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.
Hier ist mein XMLReader.h-Code
#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
Hier mein XMLReader ist. m Code
#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
Also, in diesem Code i für das Parsen von XML-Daten zu Wörterbuch-Format verwenden. Kann mir jemand zu diesem Thema helfen?
Sie erhalten Fehler, weil Sie die XML-Zeichenfolge nicht die ur übergeben müssen l. –
Danke für Replay Nirav. Können Sie erklären, wie Sie die XML-URL in diesem Code verwenden? – sarosar