2009-10-03 12 views
9

मेरे पास एक कोको ऐप है जो एक वेब सेवा कहता है। जब मैं वेब सेवा से प्रतिक्रिया का विश्लेषण करता हूं तो मुझे एक्सएमएल में प्रत्येक तत्व के लिए एनएसएक्सएमएल पार्सर के लिए मेरे संस्थापक अभियंता प्रतिनिधि के अंतिम चरित्र के रूप में \ n मिल रहा है।एनएसएसटींग isEqualToString है: n

जब मैं निम्नलिखित करने की कोशिश:

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

जांच हमेशा न्यू लाइन को पकड़ने के लिए विफल रहता है। किसी को भी एक नई लाइन की जांच करने के लिए एक अच्छा तरीका पता है?

मुझे यह भी अजीब लगता है कि प्रत्येक तत्व के प्रत्येक मूल्य के अंत में एक नई लाइन होगी, भले ही मुझे वेब सेवा से आउटपुट में इसका कोई सबूत न दिखाई दे।

यह कुछ ऐसी चीज है जो असाधारण रूप से आसान होना चाहिए।

+1

मुझे लगता है कि उपर्युक्त कोड "isEringToString:" के बजाय "isEqualToString:" होना था? –

+0

हाँ धन्यवाद, मैंने इसे प्रश्न में बदल दिया है। –

उत्तर

20

मुझे लगता है कि यह वही है जो आपको चाहिए?
टेक्स्ट = [टेक्स्ट स्ट्रिंगबीट्रिमिंग कैरैक्टर्स इनसेट: [एनएससीएचएरिएटरसेट व्हाइटस्पेस एंड न्यूलाइन कैरेक्टरसेट]];

+0

एक आकर्षण की तरह काम किया। जिज्ञासा से बाहर, किसी को पता है कि यह क्यों किया जाना चाहिए? लगभग हर दूसरी भाषा में आपको इस कदम को करने की आवश्यकता नहीं होगी, आप बस एक नई लाइन पर एक स्ट्रिंग तुलना कर सकते हैं, या यह एक मुद्दा है कि कैसे यूनिक्स ने लाइनएड कैरिज रिटर्न की व्याख्या की है जैसे जैव ने उल्लेख किया है? –

+0

स्कॉट लांस: मेरा जवाब पढ़ें। यह बताता है कि क्यों उसका 'एक्वाल टॉस्ट्रिंग:' संदेश अपेक्षित काम नहीं करता था। –

11

जब मैं वेब सेवा मैं पिछले चरित्र के रूप में एक \ N हो रही है से प्रतिक्रिया को पार्स ...

जब मैं निम्नलिखित करने की कोशिश:

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

जांच हमेशा विफल रहता होगा नई लाइन पकड़ने के लिए।

यही संदेश केवल YES वापस आ जाएगी अगर string एक वर्ण लंबा है और वह चरित्र \n है। स्ट्रिंग के अंत से

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

पट्टी\n लिए यदि आप चाहते हैं और क्या रहता है का उपयोग करें:

आप चाहे एक स्ट्रिंग \n साथ समाप्त होता है परीक्षण करना चाहते हैं, तो आप hasSuffix: उपयोग करने की आवश्यकता , फुनेहे का समाधान सही है।

संपादित करें: जेरेमी डब्ल्यू शेरमेन के जवाब में, वह बताता है कि वेब सेवा आपको सीआरएलएफ-समाप्त टेक्स्ट दे सकती है। यह एक वैध बिंदु है, और आपको लाइन के अंत में केवल \n की तलाश नहीं करनी चाहिए, बल्कि पूर्ण \r\n अनुक्रम की भी जांच करनी चाहिए। वह कोड जो वह प्रस्तुत करता है वह ऐसा करने का एक तरीका है। हालांकि आप इसे करते हैं, फिर भी आपको पूर्ण लाइन विभाजक को हटाने की आवश्यकता है, भले ही यह \r\n अनुक्रम हो।

4

वेब सेवा CRLF, यानी "\r\n" के साथ सभी लाइनों को समाप्त करने की संभावना है। आप यूनिक्स सिस्टम पर हैं, इसलिए लाइनफेड कैरेक्टर '\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 के सुझाव का उपयोग कर सकते किसी भी लाइन फाइनल खाली स्थान या नई-पंक्तियों को हटाने के लिए: यदि स्ट्रिंग एक नई पंक्ति या खाली स्थान के में समाप्त होता है परीक्षण करने के लिए, यहाँ एक ख्यात श्रेणी विधि है।