2009-10-03 16 views
9

Ho un'app Cocoa che chiama un servizio web. Quando analizzo la risposta dal servizio web sto ricevendo un \ n come ultimo carattere nel mio delegato foundCharacters per NSXMLParser per ogni elemento nell'XML.NSString isEqualToString: per n

Quando provo a fare quanto segue:

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

L'assegno sarà non riesce sempre a catturare il ritorno a capo. Qualcuno sa un buon modo per controllare la stringa di una nuova riga?

Inoltre trovo strano che ogni elemento abbia una nuova riga alla fine di ogni valore, anche se non vedo alcuna prova di ciò nell'output dal servizio web.

Questo è piuttosto il problema per qualcosa che dovrebbe essere eccezionalmente facile da fare.

+1

Presumo che il codice precedente fosse "isEqualToString:" piuttosto che "isStringEqualTo:"? –

+0

Sì grazie, l'ho modificato nella domanda. –

risposta

20

Penso che questo sia proprio quello di cui hai bisogno?
text = [text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

Ha funzionato come un fascino. Solo per curiosità, qualcuno sa perché questo deve essere fatto? In quasi tutti gli altri linguaggi non avresti bisogno di fare questo passo, potresti semplicemente fare un confronto tra stringhe su una nuova riga, o è un problema di come UNIX interpreta il ritorno a capo del linefeed come menzionato da jayw? –

+0

Scott Lance: Leggi la mia risposta. Spiega perché il suo messaggio 'isEqualToString:' non ha funzionato come previsto. –

11

Quando ho analizzare la risposta dal servizio web che sto ottenendo un \ n come ultimo carattere ...

Quando provo a fare quanto segue:

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

Il controllo sarà sempre fallisce per prendere la nuova riga.

Quel messaggio tornerà solo se YESstring è lunga un carattere e quel personaggio è \n.

Se si desidera verificare se una stringa termina con\n, allora avete bisogno di utilizzare hasSuffix::

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

Se si vuole striscia\n dalla fine della stringa e utilizzare ciò che rimane , la soluzione di phunehehe è quella giusta.

Modifica: Nella risposta di Jeremy W. Sherman, egli sottolinea che il servizio Web potrebbe fornire testo con terminazione CRLF. Questo è un punto valido, e non dovresti cercare solo \n alla fine della riga, ma anche controllare una sequenza completa \r\n. Il codice che presenta è un modo per farlo. Comunque lo fai, devi comunque eliminare il separatore di riga completo, anche se si tratta di una sequenza \r\n.

4

Il servizio Web sta probabilmente chiudendo tutte le linee con CRLF, ad esempio "\r\n". Sei su un sistema UNIX, quindi il carattere linefeed '\n' viene preso come separatore di riga; il ritorno a capo '\r' viene lasciato come parte della riga precedente. Quando viene stampato, avrà lo stesso effetto di '\n'. Hai verificato (utilizzando, ad esempio, strvis) che il carattere di fine riga è '\n' e non '\r'?

-[NSString hasSuffix:] catturerà solo il carattere di nuova riga specifico fornito.Per verificare se la stringa termina con un ritorno a capo o spazi bianchi, ecco un metodo categoria putativo:

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

È possibile utilizzare il suggerimento di phunehehe di text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] di cancellare qualunque spazi line-finale o ritorni a capo.

Problemi correlati