Vai al contenuto

Aiuto con NSXDocument


fermat

Messaggi raccomandati

ciao!

sto cercando di leggere un file XML e riempire un NSMutableArray con i vari attributi dei nodi.

ho provato così:

+ (NSMutableArray *) check {
   NSError *err = nil;
   NSMutableArray *result = [[NSMutableArray alloc] init];
   NSURL *url = [NSURL URLWithString:@"http://www.google.com/ig/api?weather=roma&hl=it"];
   NSXMLDocument *doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA) error:&err];
   NSXMLElement *element;
   NSArray *forecastInfo = [doc nodesForXPath:@"//xml_api_reply/weather/forecast_information" error:&err];
   if([forecastInfo count] > 0) {
    for(int i = 0; i < [forecastInfo count]; i++) {
	    element = [forecastInfo objectAtIndex:i];
	    [result addObject:[element childAtIndex:0]];
    }
   }
   return result;
}

ma mi da errore:

2012-02-01 21:42:22.095 OBJCWeather[1937:707] *** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array
2012-02-01 21:42:22.103 OBJCWeather[1937:707] (...........

penso che almeno un problema sia che così facendo prendo i valori dei nodi e nn gli attributi.

ma i nodi nn hanno valori ma solo attributi.

avete qualche idea?

Link al commento
Condividi su altri siti

ho provato anche in altro modo:

+ (NSMutableArray *) check {
   NSError *err = nil;
   NSMutableArray *result = [[NSMutableArray alloc] init];
   NSURL *url = [NSURL URLWithString:@"http://www.google.com/ig/api?weather=roma&hl=it"];
   if(!url) {
    NSLog(@"Errore nell'url");
    exit(0);
   }
   NSXMLDocument *doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA) error:&err];
   NSXMLElement *rootElement = [doc rootElement];
   NSArray *forecastInfo = [rootElement nodesForXPath:@"//weather/forecast_information" error:&err];
   for(NSXMLElement *element in forecastInfo) {
    [result addObject:[element attributeForName:@"data"]];
   }
   return result;
}

ma ottengo lo stesso errore.

solo che nn riesco neanche a capire bene dove sia l'errore.

nel senso che nn vedo una riga specifica.

Link al commento
Condividi su altri siti

ho fatto un'altra prova seguendo una guida:

+ (NSMutableArray *) check {
   NSString *city = @"roma";
   NSMutableArray *result = [[NSMutableArray alloc] init];
   NSXMLDocument *doc = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", city]] options:0 error:nil];
   NSString *forecastInfoCity = [[[[doc nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue];

   [result addObject:forecastInfoCity];
   return result;
}

solo che mi da lo stesso errore.

vorrei capire se sbaglio nell'aggiungere valori all'array o prima.

come posso stampare il valore di forecastInfoCity per vedere se è valorizzato?

Link al commento
Condividi su altri siti

ho fatto così:

+ (NSMutableArray *) check {
NSError *err;
NSMutableArray *result = [[NSMutableArray alloc] init];
NSXMLDocument *doc = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com/ig/api?weather=roma"] options:0 error:nil];
if(doc == NULL) {
	NSLog(@"Unable to parse");
}
NSString *forecastInfoCity = [[[[doc nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:&err] objectAtIndex:0] attributeForName:@"data"] stringValue];
[result addObject:forecastInfoCity];
return result;
}

nn ricevo alcun messaggio di errore nel log.

Link al commento
Condividi su altri siti

Ho fatto un test con il codice che hai riportato sopra. Il problema è che il link che chiami non viene riconosciuto come valido da NSXMLDocument (lo puoi verificare passando un NSError e stampando l'errore a console con NSLog). Devi usare come option NSXMLDocumentTidyXML che fa un controllo per sistemare l'xml e così non da più errore. Ti consiglio di usare frequentemente il controllo degli errori e di stamparti i risultati nella console. Tra l'altro il controllo che hai messo non funziona e non ti stampa a console "Unable to parse" perché controlli che doc sia NULL invece essendo Objective C devi controllare se l'oggetto è nil o più semplicemente se scrivi

if(!doc)
{
NSLog("Unable to parse");
}

Mobile & Web Developer | samuele@mr-apps.comMr.Apps

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...