0

xml の解析に問題があります。解析用のクラスを作成しました。xmlURL は正しい (デバッグからテスト) が、メソッド parse を呼び出すと、変数 success が 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 に答える