2009-10-03 81 views
9

我有一個調用Web服務的Cocoa應用程序。當我解析Web服務的響應時,我得到一個\ n作爲XML中每個元素的NSXMLParser的foundCharacters委託中的最後一個字符。NSString isEqualToString:for n

當我試圖做到以下幾點:

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

則檢查總會未能趕上換行符。任何人都知道一個很好的方法來檢查一個換行符?

我也覺得奇怪的是,每個元素在每個值的末尾都會有一個換行符,即使我在Web服務的輸出中看不到任何證據。

這是非常容易做的事情的問題。

+1

我假設上面的代碼是爲了「isEqualToString:」而不是「isStringEqualTo:」? – 2009-10-03 15:46:49

+0

是的,謝謝你,我改變了它的問題。 – 2009-10-03 17:24:58

回答

20

我認爲這正是您需要的嗎?
text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

像魅力一樣工作。出於好奇,任何人都知道爲什麼必須這樣做?在幾乎所有其他語言中,您都不需要執行此步驟,只需在換行符上進行字符串比較,或者如何將UNIX解釋爲像jayw提到的換行回車問題? – 2009-10-05 14:34:18

+0

Scott Lance:閱讀我的答案。它解釋了爲什麼他的'isEqualToString:'消息沒有按照他的預期工作。 – 2009-10-05 21:01:40

11

當我解析從Web服務我得到一個\ n的最後一個字符的響應...

當我試圖做到以下幾點:

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

的檢查將始終失敗趕上換行。

該消息將只返回YES如果string是一個字符,並且該字符是\n

如果你想測試一個字符串是否與\n結束,那麼你就需要使用hasSuffix::從字符串的結尾

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

如果你想\n並使用剩下,phunehehe的解決方案是正確的。

編輯:在Jeremy W. Sherman的回答中,他指出Web服務可能會給你CRLF終止的文本。這是一個有效的點,您不僅應該在行末查找\n,還要檢查完整的\r\n順序。他提供的代碼是一種方法。但是,如果您這樣做,即使它是一個\r\n序列,您仍然需要刪除完整行分隔符。

4

該Web服務可能終止所有包含CRLF的行,即"\r\n"。您處於UNIX系統中,因此換行字符'\n'被視爲行分隔符;回車'\r'保留爲上一行的一部分。打印時,其效果與'\n'相同。您是否驗證過(使用strvis)行尾字符是'\n'而不是'\r'

-[NSString hasSuffix:]只會捕獲您提供的特定換行符。爲了測試是否在字符串中換行或空白結束,這裏是一個公認的分類方法:

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

您可以使用text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] phunehehe的建議,以消除任何行最後的空白或換行。