2009-10-03 16 views
9

Tengo una aplicación Cocoa que llama a un servicio web. Cuando analizo la respuesta del servicio web obtengo un \ n como el último carácter en mi delegado foundCharacters para NSXMLParser para cada elemento en el XML.NSString isEqualToString: para n

Cuando trato de hacer lo siguiente:

if (![string isEqualToString:@"\n"]) 

el cheque será siempre es incapaz de captar la nueva línea. ¿Alguien sabe una buena manera de comprobar una nueva línea?

También me parece extraño que cada elemento tenga una nueva línea al final de cada valor, aunque no veo evidencia de eso en la salida del servicio web.

Este es todo un problema para algo que debe ser excepcionalmente fácil de hacer.

+1

Supongo que el código anterior estaba destinado a ser "isEqualToString:" en lugar de "isStringEqualTo:"? –

+0

Sí, gracias, lo he cambiado en la pregunta. –

Respuesta

20

Creo que esto es justo lo que necesita?
text = [text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

Funcionó como un encanto. Solo por curiosidad, ¿alguien sabe por qué debe hacerse esto? En casi todos los demás idiomas, no tendría que hacer este paso, simplemente podría hacer una comparación de cadenas en una nueva línea, o una cuestión de cómo UNIX interpreta el retorno del carro de salto de línea como lo mencionó Jayw. –

+0

Scott Lance: Lee mi respuesta. Explica por qué su mensaje 'isEqualToString:' no funcionó como esperaba. –

11

Cuando analizar la respuesta del servicio web que estoy recibiendo un \ n como el último carácter ...

Cuando trato de hacer lo siguiente:

if (![string isEqualToString:@"\n"]) 

El cheque será siempre falla para atrapar la nueva línea.

Ese mensaje, sólo se obtendrán si YESstring es un carácter de longitud y que el carácter es \n.

Si desea probar si una cadena termina con\n, entonces es necesario utilizar hasSuffix::

if (![string hasSuffix:@"\n"]) 

Si desea tira\n desde el final de la cadena y utilizar lo que queda , la solución de phunehehe es la correcta.

Edit: En la respuesta de Jeremy W. Sherman, señala que el servicio web puede estar entregando un texto con terminación CRLF. Este es un punto válido, y no solo debe buscar \n al final de la línea, sino también verificar la secuencia completa de \r\n. El código que presenta es una forma de hacerlo. Independientemente de cómo lo haga, igual debe eliminar el separador de línea completo, incluso si se trata de una secuencia \r\n.

4

Es probable que el servicio web termine todas las líneas con CRLF, es decir, "\r\n". Está en un sistema UNIX, por lo que el carácter de salto de línea '\n' se toma como el separador de línea; el retorno de carro '\r' se deja como parte de la línea anterior. Cuando se imprima, tendrá el mismo efecto que '\n'. ¿Ha verificado (utilizando, por ejemplo, strvis) que el carácter de final de línea es '\n' y no '\r'?

-[NSString hasSuffix:] solo captará el carácter de nueva línea específico que proporcione.Para probar si la cadena termina en un salto de línea o espacios en blanco, aquí es un método categoría putativa:

- (BOOL)my_hasWhitespaceOrNewlineSuffix { 
    NSRange r = [self rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] 
            options:NSBackwardsSearch]; 
    BOOL foundChar = r.location != NSNotFound; 
    BOOL isLineFinal = foundChar && (r.location + r.length == [self length]); 
    return isLineFinal; 
} 

Usted puede utilizar la sugerencia de phunehehe de text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] para eliminar cualquier espacio en blanco o saltos de línea-línea final.