2010-06-01 53 views
0

我有一个XML解析的问题。 我已经创建了一个解析类。 xmlURL是正确的(从调试中测试它),但是当我调用方法解析变量成功变为FALSE并且errorParsing是“NSXMLParserErrorDomain”。解析XML与iPhone应用程序的问题

你能帮我吗? 我的代码如下。

#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 

回答

1

尝试实现这个委托方法:

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

它会调用该委托时,解析器遇到一个错误。

+0

这种方法有什么改变? – zp26 2010-06-01 14:14:08