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