2010-06-01 4 views
0

J'ai un problème avec l'analyse XML. J'ai créé une classe pour l'analyse. Le xmlURL est correct (en le testant à partir de debug) mais quand j'appelle la méthode analyser la variable succès devient FALSE et un errorParsing est "NSXMLParserErrorDomain".Problème avec l'analyse XML avec l'application iPhone

Pouvez-vous m'aider? Mon code est ci-dessous.

#import "xmlParser.h" 
#import"Posizione.h" 


@implementation xmlParser 

@synthesize arrayPosizioniXML; 

NSString *tempString; 
Posizione *posizioneRilevata; 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if([tempString isEqualToString:@"name"]) 
     posizioneRilevata.nome = string; 

    else if([tempString isEqualToString:@"x"]) 
     posizioneRilevata.valueX = [string floatValue]; 

    else if([tempString isEqualToString:@"y"]) 
     posizioneRilevata.valueY = [string floatValue]; 

    else if([tempString isEqualToString:@"z"]) 
     posizioneRilevata.valueZ = [string floatValue]; 

    else if([tempString isEqualToString:@"/posizione"]) 
     [arrayPosizioniXML addObject:posizioneRilevata]; 
} 


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    //[textArea setText:[[NSString alloc] initWithFormat:@"%@\nFine elemento: %@",textArea.text,elementName]]; 
} 


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 

    if ([elementName isEqualToString:@"name"]){ 
     tempString = @"name"; 
     NSLog(@"ok"); 
    } 
    else if([elementName isEqualToString:@"x"]){ 
     tempString = @"x"; 
    } 
    else if([elementName isEqualToString:@"y"]) { 
     tempString = @"y"; 
    } 
    else if([elementName isEqualToString:@"z"]) { 
     tempString = @"z"; 
    } 
    else if([elementName isEqualToString:@"/posizione"]) { 
     tempString = @"/posizione"; 
    } 
} 


-(BOOL)avviaParsing{ 
    //Bisogna convertire il file in una NSURL altrimenti non funziona 
    NSLog(@"zp26 %@",path); 

    NSURL *xmlURL = [NSURL fileURLWithPath:path]; 
    // Creiamo il parser 
    NSXMLParser *parser = [[ NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
    // Il delegato del parser e' la classe stessa (self) 
    [parser setDelegate:self]; 
    //Effettuiamo il parser 
    BOOL success = [parser parse]; 
    //controlliamo come è andata l'operazione 
    if(success == YES){ 
     //parsing corretto 
     return TRUE; 
    } else { 

     NSError *errorParsing = [[NSError alloc]init]; 
     errorParsing = [parser parserError]; 
     //c'è stato qualche errore... 
     return FALSE; 
    } 
    // Rilasciamo l'oggetto NSXMLParser 
    [parser release]; 
} 


-(id)init { 
    self = [super init]; 
    if (self != nil) { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 
     path = [documentsDirectoryPath stringByAppendingPathComponent:@"filePosizioni.xml"]; 

     posizioneRilevata = [[Posizione alloc]init]; 
     tempString = [[NSString alloc]init]; 
    } 
    return self; 
} 

@end 



@implementation AccelerometroViewController 

-(BOOL)caricamentoXML{ 

    xmlParser *parser; 

    parser = [[xmlParser alloc]init]; 

    if([parser avviaParsing]){ 
     [arrayPosizioni addObjectsFromArray:parser.arrayPosizioniXML]; 
     return TRUE; 
    } 
    else 
     return FALSE; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if([self caricamentoXML]){ 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Caricamento Posizioni da Xml" message:@"Posizione caricata con successo" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    } 
    else{ 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Caricamento Posizioni da Xml" message:@"Posizione non caricate" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    } 

} 

@end 

Répondre

1

Essayez cette mise en œuvre des méthodes de délégué:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; 

Il appellera le délégué lorsque l'analyseur rencontre une erreur.

+0

Qu'est-ce qui change cette méthode? – zp26