0

我有一个 xml 解析的问题。我创建了一个用于解析的类。xmlURL 是正确的(从调试中测试它)但是当我调用方法解析时变量成功变为 FALSE 并且 errorParsing 是“NSXMLParserErrorDomain”。

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

#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
4

1 回答 1

1

尝试实现这个委托方法:

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

当解析器遇到错误时,它将调用委托。

于 2010-06-01T10:03:26.620 回答