2012-04-18 15 views
9

estoy usando NSXMLParser para analizar un xml de una url (mi código es casi exactamente el mismo que here)NSXMLParser no puede analizar los caracteres especiales (acentos)

Algunos de los elementos contienen caracteres especiales como "A "que hace que una palabra lik ándre se divida en dos (á y ndre).

Aquí es mi 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;} 

Estoy bastante seguro de que es debido a que la codificación no se establece (creo que tiene que ser NSUTF8StringEncoding), pero no estoy seguro de dónde/cómo aplicarlo.

[ACTUALIZACIÓN] resto de mi código ...

- (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]]; 
} 

[ACTUALIZACIÓN 2] XML de ejemplo ...

<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

Soy nuevo en Obj-C, pero me parece que podría convertir datos en un NSString, codificar eso como UTF8 [como se muestra aquí] (http://stackoverflow.com/questions/2467844/ convert-utf-8-encoded-nsdata-to-nsstring) y pasarlo a NSXMLParser? – inkedmn

+0

Uso NSXMLParser mucho y no he tenido ese problema. ¿Puedes publicar la porción del código que procesa el texto XML? –

+0

Publiqué el resto de mi código. Me pregunto si el problema ahora radica en foundCharacters? –

Respuesta

5

Me cargar la URL a un NSString y luego convertir Me gusta esto.

-(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 puede ser que su método parser:foundCharacters: está asignando a su currentNodeContent en lugar de añadir. Ver el Apple Doc en el siguiente enlace.

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

Desde el doc:

Debido cadena puede ser sólo una parte del contenido de carácter total para el elemento actual, se debe anexar a la acumulación actual de caracteres hasta que cambie el elemento.

+1

Gracias. Eso no resolvió completamente mi problema (¡aunque pensé que sería así!) Hacer un NSLog (@ "% @", dataString); muestra que la cadena sí incluye caracteres con acentos, etc. que es genial.Sin embargo, una palabra como Ándre todavía se está rompiendo. Eso me hace pensar que el problema está en foundcharacters(). Ver mi pregunta actualizada –

+0

¿Se ha roto el trabajo en el registro que mencionaste o solo después de pensar en el analizador? –

+0

En el registro, las cadenas se muestran correctamente. Al agregar el objeto a la matriz de tickets, un nombre con un carácter especial se registrará como dos objetos separados. –

1

Uso

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 

y para obtener la cadena de ella, hacer esto:

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

A continuación, se puede analizar el código XML en sus métodos NSXMLParserDelegate.

Espero que esto ayude.

4

¡Encontró el problema! De hecho, está en los personajes encontrados. Debe cambiar su código a este:

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

Estaba teniendo el mismo problema antes, y el código anterior lo ha solucionado.

Cuestiones relacionadas