/ Published in: iPhone
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
åšiPhone的网络应用,处ç†XML是家常便é¥ï¼ŒNSXMLParser用起æ¥è¿˜æ˜¯å¾—心应手的。ä¸è¿‡è¿™ä¸ªä¸œè¥¿ï¼Œå¤„ç†éžUTF-8,会解æžå¤±è´¥ã€‚è¿™ç¯‡æ–‡ç« å°±æ˜¯æƒ³å’Œå¤§å®¶ä¸€èµ·åˆ†äº«ä¸€äº›è¿™æ–¹é¢å¼€å‘的新的。 我们在æŸä¸ªRSS地å€ï¼Œå¯ä»¥å¾—到下é¢è¿™æ ·çš„XML文件。我这里åªæ˜¯æˆªå–一段, --------------------------------------- <?xml version="1.0" encoding="big5"?> <rss version="2.0"> <channel> <title>RTHK On Internet - å³ æ™‚ æ–° èž</title> <link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/]]></link> <description>RTHK On Internet - å³ æ™‚ æ–° èž</description> <pubDate>Sun, 11 Oct 2009 15:02:02 +0800</pubDate> <item> <title><![CDATA[衞生署è¦æ±‚浸會醫院4周內 就產婦æ»äº¡å€‹æ¡ˆæäº¤å ±å‘Š ]]></title> <link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/20091011/news_20091011_55_618483.htm]]></link> <description><![CDATA[ 衞生署昨晚已經收到浸會醫院通知,有一宗產婦æ»äº¡å€‹æ¡ˆï¼Œæµ¸æœƒé†«é™¢éœ€è¦åœ¨4星期內å‘衞生署æäº¤å ±å‘Šï¼Œæ¡ˆä»¶äº¦äº¤ç”±æ»å› åºè·Ÿé€²ã€‚ 衞生署數å—顯示,由07年至今年8月,共接ç²97å®—ç§å®¶é†«é™¢é†«ç™‚äº‹æ•…çš„é€šå ±ã€‚åŽ»å¹´ç™¼ç”Ÿçš„äº‹æ•…ä¸ï¼Œæœ€å¤šçš„是進行手術或介入程åºæœŸé–“出ç¾ä½µç™¼ç—‡ï¼Œå…¶æ¬¡é‚„有å•å©¦åŠç”¢å©¦æ»äº¡ï¼Œæˆ–與å•å©¦åœ¨åˆ†å¨©éŽç¨‹ä¸ï¼Œç”Ÿç”¢æ™‚,或產後出ç¾åš´é‡ä½µç™¼ç—‡ï¼›éƒ¨ä»½å‰‡åŒ…括åˆç”Ÿå¬°å…’出ç¾æ»äº¡æˆ–åš´é‡å—傷;錯誤為病人或身體部ä½é€²è¡Œå¤–科或介入手術程åºç‰ã€‚ ]]></description> <pubDate> Sun, 11 Oct 2009 14:50:46 +0800 </pubDate> </item> </channel> </rss> ---------------------------------------- 这是一个很常用的RSS返回的XML,是ç¹ä½“ä¸æ–‡çš„,编ç æ ¼å¼æ˜¯big5。说编ç æ ¼å¼æ˜¯big5有两层æ„æ€ï¼š [1] 网络æµè¿”回的NSData是big5ç¼–ç çš„ã€‚æ‰€ä»¥è¿™æ ·çš„NSDataé€ç»™NSXMLParser是ä¸èƒ½æ£ç¡®è§£æžçš„。 [2] 第一å¥è¯æŒ‡æ˜Žäº†XML文件也是用big5ç¼–ç 的。 对应于上é¢ä¸¤ä¸ªé—®é¢˜ï¼Œæˆ‘的解决æ€è·¯æ˜¯ï¼š [2] 将第一行<?xml version="1.0" encoding="big5"?>转æ¢æˆ<?xml version="1.0" encoding="utf-8"?> 第二个转æ¢ä¸éš¾ï¼Œåªè¦æˆ‘们有NSString对象。第一个转æ¢è¦ç”¨åˆ°CFStringRef,代ç 如下: Cpp代ç CFStringRef big5Str = CFStringCreateWithBytes(NULL, [inData bytes], [inData length], kCFStringEncodingBig5_HKSCS_1999, false); //[A] if (NULL == big5Str) { return nil; } else { NSString *utf8NSString = [big5NSString stringByReplacingOccurrencesOfString:@"<?xml version=\"1.0\" encoding=\"big5\"?>" withString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; //[B] return [utf8NSString dataUsingEncoding:NSUTF8StringEncoding]; //[C] } CFStringRef big5Str = CFStringCreateWithBytes(NULL, [inData bytes], [inData length], kCFStringEncodingBig5_HKSCS_1999, false); //[A] if (NULL == big5Str) { return nil; } else { NSString *utf8NSString = [big5NSString stringByReplacingOccurrencesOfString:@"<?xml version=\"1.0\" encoding=\"big5\"?>" withString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; //[B] return [utf8NSString dataUsingEncoding:NSUTF8StringEncoding]; //[C] ä¸é—´çš„[B]就解决了问题[2]。这里è¦æ³¨æ„两个问题: (1ï¼‰å¦‚æžœä½ çš„XMLç¼–ç 是GBK,或者GB23120或者其他的,kCFStringEncodingBig5_HKSCS_1999è¦æ¢æˆä½ 对应的编ç æ–¹å¼ã€‚ (2)å¦‚æžœä½ çš„XMLç¼–ç 也是big5的,也许kCFStringEncodingBig5_HKSCS_1999并ä¸é€‚åˆä½ çš„åº”ç”¨ã€‚å› ä¸ºå¯¹åº”big5çš„ç¼–ç 常é‡è¿˜æœ‰ä¸¤ç§ï¼Œä»–们是: kCFStringEncodingBig5_E kCFStringEncodingBig5。 è¿™ä¸ªä½ å¯ä»¥æŸ¥é˜…帮助文档,然åŽä¸€ä¸ªä¸ªè¯•ã€‚ 然åŽæŠŠreturnçš„NSDataé€åˆ°NSXMLParser,就å¯ä»¥æ£ç¡®è§£æžäº†ã€‚å¯æ˜¯è¿˜æ²¡æœ‰ç»“æŸï¼Œå¤§å®¶ä»”细看看XML文件里é¢è¿˜æœ‰衞è¿™æ ·çš„ä¸œè¥¿ã€‚è¿™ä¸ªæ˜¯ç¹ä½“ä¸æ–‡â€è¡›â€œå—,我们如果ä¸å¤„ç†è¿™ä¸ªä¸œè¥¿ï¼Œæ˜¾ç¤ºç»™ç”¨æˆ·çœ‹å¾—就是衞,这显然是ä¸è¡Œçš„。这个其实也好办,åªéœ€è¦ç”¨ä¸‹é¢è¿™å¥è¯å°±å¯ä»¥æŠŠä¸€ä¸ªnumber转æˆNSString了: 这个number就是34910,是一个整数,å进制的整数(ä¸æ˜¯åå…进制的)。到这里,整个处ç†è¿‡ç¨‹å°±OK了,我们就å¯ä»¥æ£ç¡®å¾—到Big5çš„RSSæ–°é—»äº†ã€‚å› ä¸ºè¿™æ˜¯ä¸€ä¸ªå®¢æˆ·é¡¹ç›®ï¼Œä¸è¿‡æˆ‘å¯ä»¥ç»™å„å°æˆªå›¾å¤§å®¶çœ‹çœ‹ï¼š
URL: http://www.javaeye.com/topic/493525