2016-06-13 8 views
-1

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?

+1

Sie erhalten Fehler, weil Sie die XML-Zeichenfolge nicht die ur übergeben müssen l. –

+0

Danke für Replay Nirav. Können Sie erklären, wie Sie die XML-URL in diesem Code verwenden? – sarosar

Antwort

1

Versuchen Sie etwas wie das. Decalre unten Methode in AppDelegate.h Datei

+(void)downloadDataFromURL:(NSURL *)url withCompletionHandler:(void(^)(NSData *data))completionHandler; 

die Methodendefinition in AppDelegate.m

+(void)downloadDataFromURL:(NSURL *)url withCompletionHandler:(void (^)(NSData *))completionHandler{ 
// Instantiate a session configuration object. 
     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

// Instantiate a session object. 
     NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; 

// Create a data task object to perform the data downloading. 
     NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    if (error != nil) { 
     // If any error occurs then just display its description on the console. 
     NSLog(@"%@", [error localizedDescription]); 
    } 
    else{ 
     // If no error occurs, check the HTTP status code. 
     NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode]; 

     // If it's other than 200, then show it on the console. 
     if (HTTPStatusCode != 200) { 
      NSLog(@"HTTP status code = %d", HTTPStatusCode); 
     } 

     // Call the completion handler with the returned data on the main thread. 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      completionHandler(data); 
     }]; 
    } 
}]; 
} 

Jetzt Rufen Sie diese Methode von Ihrem Viewcontroller wie dies in viewDidLoad Datei hinzufügen

[AppDelegate downloadDataFromURL:url withCompletionHandler:^(NSData *data) { 
    // Make sure that there is data. 
    if (data != nil) { 
     xmlDict = [XMLReader dictionaryForXMLData:data error:&parseError]; 
    } 
}]; 

Hoffnung Dies wird Ihnen helfen

+0

Haben Sie meine Antwort versucht? –

+0

Ja. Es funktioniert gut. Danke Nirav. – sarosar