2009-10-03 35 views
9

Tôi có một ứng dụng Cocoa gọi một dịch vụ web. Khi tôi phân tích cú pháp phản hồi từ dịch vụ web, tôi nhận được ký tự cuối cùng trong đại diện foundCharacters của tôi cho NSXMLParser cho mỗi phần tử trong XML.NSString isEqualToString: cho n

Khi tôi cố gắng làm như sau:

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

Vui lòng cung sẽ luôn luôn thất bại trong việc nắm bắt những dòng mới. Bất cứ ai biết một cách tốt để chuỗi kiểm tra một dòng mới?

Tôi cũng thấy kỳ lạ là mỗi phần tử sẽ có một dòng mới ở cuối mỗi giá trị, mặc dù tôi không thấy bằng chứng nào về điều đó trong đầu ra từ dịch vụ web.

Đây thực sự là vấn đề đối với một thứ đặc biệt dễ làm.

+1

Tôi giả sử mã ở trên có nghĩa là "isEqualToString:" thay vì "isStringEqualTo:"? –

+0

Có cảm ơn bạn, tôi đã thay đổi nó trong câu hỏi. –

Trả lời

20

Tôi nghĩ đây chỉ là những gì bạn cần?
văn bản = [chuỗi văn bảnByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

Làm việc như một sự quyến rũ. Chỉ vì tò mò, bất cứ ai biết tại sao điều này phải được thực hiện? Trong hầu hết mọi ngôn ngữ khác, bạn sẽ không cần phải làm bước này, bạn có thể chỉ cần so sánh chuỗi trên một dòng mới, hoặc nó là một vấn đề về cách UNIX diễn giải trả về dòng lệnh như jayw đã đề cập? –

+0

Scott Lance: Đọc câu trả lời của tôi. Nó giải thích tại sao thông điệp 'isEqualToString:' của anh ta không hoạt động như mong đợi. –

11

Khi tôi phân tích phản hồi từ dịch vụ web Tôi nhận được một \ n là ký tự cuối cùng ...

Khi tôi cố gắng làm như sau:

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

Vui lòng cung sẽ luôn luôn thất bại để bắt dòng mới.

Thông báo đó sẽ chỉ trả lại YES nếu string dài một ký tự và ký tự đó là \n.

Nếu bạn muốn kiểm tra xem một chuỗi kết thúc với\n, sau đó bạn cần phải sử dụng hasSuffix::

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

Nếu bạn muốn dải\n từ ngày kết thúc của chuỗi và sử dụng những gì còn lại , phunehehe là giải pháp đúng.

Chỉnh sửa: Trong câu trả lời của Jeremy W. Sherman, ông chỉ ra dịch vụ web có thể cung cấp cho bạn văn bản được CRLF chấm dứt. Đây là một điểm hợp lệ, và bạn không nên tìm kiếm \n ở cuối dòng, mà còn kiểm tra toàn bộ chuỗi \r\n. Mã anh trình bày là một cách để làm điều đó. Tuy nhiên bạn làm điều đó, bạn vẫn cần phải xóa dấu tách dòng đầy đủ, ngay cả khi đó là một chuỗi \r\n.

4

Dịch vụ web có khả năng chấm dứt tất cả các dòng với CRLF, tức là, "\r\n". Bạn đang sử dụng hệ thống UNIX, vì vậy ký tự linefeed '\n' được lấy làm dấu tách dòng; trở về vận chuyển '\r' được để lại như một phần của dòng trước đó. Khi in, nó sẽ có tác dụng tương tự như '\n'. Bạn đã xác minh (sử dụng, giả sử, strvis) rằng ký tự dòng cuối cùng là '\n' và không phải là '\r'?

-[NSString hasSuffix:] sẽ chỉ bắt ký tự dòng mới cụ thể mà bạn cung cấp.Để kiểm tra xem chuỗi kết thúc bằng một dòng mới hoặc khoảng trắng, đây là một phương pháp loại giả định:

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

Bạn có thể sử dụng đề xuất phunehehe của text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] để loại bỏ bất kỳ khoảng trắng dòng kết hoặc dòng mới.