2012-04-18 10 views
9

sto usando NSXMLParser per analizzare un XML da un URL (il mio codice è quasi esattamente la stessa di here)NSXMLParser non può analizzare i caratteri speciali (accenti)

Alcuni degli elementi contengono caratteri speciali come "A "che causa una parola lik ándre a dividere in due (á e ndre).

Ecco il mio loadXMLByURL

-(id) loadXMLByURL:(NSString *)urlString{ 
tickets  = [[NSMutableArray alloc] init]; 
NSURL *url  = [NSURL URLWithString:urlString]; 
NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
parser   = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
[parser parse]; 
return self;} 

Sono abbastanza sicuro che è perché la codifica non è impostata (penso che deve essere NSUTF8StringEncoding), ma non sono sicuro dove/come applicarla.

[UPDATE] Resto del mio codice ...

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{  
    if ([elementname isEqualToString:@"ticket"]) 
    { 
     currentTicket = [Ticket alloc]; 
    } 

} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementname isEqualToString:@"name"]) 
    { 
     currentTicket.name = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"title"]) 
    { 
     currentTicket.title = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"status"]) 
    { 
     currentTicket.status = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"ticket"]) 
    { 
     [tickets addObject:currentTicket]; 
     [currentTicket release]; 
     currentTicket = nil; 
     [currentNodeContent release]; 
     currentNodeContent = nil; 
    } 

} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

[UPDATE 2] XML di esempio ...

<RB> 
    <list> 
     <ticket> 
      <name>Andrew Ford</name> 
      <title>3rd release</title> 
      <status>1</status> 
     </ticket> 

     <ticket> 
      <name>David Jenkins</name> 
      <title>3rd release</title> 
      <status>0</status> 
     </ticket> 

     <ticket> 
      <name>Luis gomez ándre</name> 
      <title>3rd release</title> 
      <status>1</status> 
     </ticket> 
    </list> 
</RB> 
+0

Sono nuovo di zecca per Obj-C, ma mi sembra che potresti convertire i dati in un NSString, codificarlo come UTF8 [come mostrato qui] (http://stackoverflow.com/questions/2467844/ convert-utf-8-encoded-nsdata-to-nsstring) e passarlo a NSXMLParser? – inkedmn

+0

Uso molto NSXMLParser e non ho riscontrato questo problema. Puoi pubblicare la parte del codice che elabora il testo XML? –

+0

Inserito il resto del mio codice. Mi chiedo se il problema si trova ora in foundCharacters? –

risposta

5

vorrei caricare l'URL a un NSString e poi convertire come questo.

-(id) loadXMLByURL:(NSString *)urlString{ 

    tickets  = [[NSMutableArray alloc] init]; 
    NSURL *url  = [NSURL URLWithString:urlString]; 
    NSError *error; 
    NSString * dataString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 
    parser   = [[NSXMLParser alloc] initWithData:data]; 
    parser.delegate = self; 
    [parser parse]; 
    return self; 

} 

EDIT: Parte del problema potrebbe essere che il tuo metodo parser:foundCharacters: sta assegnando al vostro currentNodeContent invece di aggiungere. Vedi il documento Apple al seguente link.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html

Dal doc:

Perché stringa può essere solo una parte del contenuto totale di carattere per l'elemento corrente, è necessario aggiungerlo alla accumulazione di caratteri fino a quando le modifiche degli elementi.

+1

Grazie. Questo non ha risolto il mio problema (anche se pensavo che lo sarebbe)! Fare un NSLog (@ "% @", dataString); mostra che la stringa include effettivamente caratteri con accenti ecc. che è grandiosa.Tuttavia una parola come ándre sta ancora rompendo. Questo mi fa pensare che il problema sia in foundcharacters(). Vedi la mia domanda aggiornata. –

+0

Il lavoro è rotto nel log che hai menzionato o solo dopo aver pensato il parser? –

+0

Nel registro le stringhe sono visualizzate correttamente. È quando si aggiunge l'oggetto alla matrice di ticket, un nome con un carattere speciale verrà registrato come due oggetti separati. –

1

Usa

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 

e per ottenere la stringa da esso, fare questo:

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes] 
                length:[data length] 
               encoding:NSUTF8StringEncoding]; 

Quindi è possibile analizzare il codice XML nei tuoi metodi NSXMLParserDelegate.

Spero che questo aiuti.

4

Trovato il problema! È davvero nei personaggi trovati. A questo scopo, è necessario modificare il codice:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    NSLog(@"found characters: %@", string); 
    if (!currentNodeContent) { 
     currentNodeContent = [[NSMutableString alloc] init]; 
    } 
    [currentNodeContent appendString:string]; 
} 

Avevo già lo stesso problema e il codice precedente lo ha risolto.

Problemi correlati