//取XML文件的前40個字節
NSData * xmldata = [self.ItemData subdataWithRange:NSMakeRange(0,40)];
//以UTF-8編碼進行解碼
NSString *xmlstr = [[NSString alloc] initWithData:xmldata encoding:NSUTF8StringEncoding];
//NSLog(@"XML HEADER: %@", xmlstr);
//搜索GB2312,如果找到,就對整個文件進行編碼轉換
if ([xmlstr rangeOfString:@"\"GB2312\"" options:NSCaseInsensitiveSearch].location != NSNotFound)
{
// NSLog(@"GB2312 encoding founded.");
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *utf8str = [[[NSString alloc] initWithData:self.ItemData encoding:enc] autorelease];
utf8str = [utf8str stringByReplacingOccurrencesOfString:@"\"GB2312\"" withString:@"\"utf-8\"" options:NSCaseInsensitiveSearch range:NSMakeRange(0,40)];
NSData *newData = [utf8str dataUsingEncoding:NSUTF8StringEncoding];
self.ItemData = newData;
}
GB2312或GBK編碼的網頁,要先用gb編碼解碼,然後替換其中的gb字符串,再用utf8編碼成data給parser就能解析中文網頁了。
NSXMLParser 將停止解析在遇到特殊字符後
我讀一個 XML 文件從谷歌天氣 api 和解析它使用 NSXMLParser。城市問題是巴黎。這是我得到的簡短 xml 輸出
<?xml version="1.0"?>
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" ><forecast_information>
<city data="Paris, Île-de-France"/>
<postal_code data="Paris"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
...
...
現在我用來削去此 xml 的代碼是
NSString *address = @"http://www.google.com/ig/api?weather=Paris";
NSURL *URL = [NSURL URLWithString:address];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
[parser setDelegate:self];
[parser parse];
...
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
NSLog(@"XML Parser 1 ... elementName ... %@", elementName);
}
這是我獲得上述 xml 的輸出
XML Parser 1 ... elementName ... xml_api_reply
XML Parser 1 ... elementName ... weather
XML Parser 1 ... elementName ... forecast_information
問題是它分析的所有標記,直到它到達"城市數據"因爲巴黎 î l e de 法國,然後它就會停止的名稱中有非 ascii 字符。它不會處理之後像 postal_code 的標籤。緯度、 經度等。
所以我的問題是,有什麼辦法可以從返回的 URL XML 字符串中刪除所有非 ascii 字符嗎?
解決方法 1:
還行。我已經解決了此問題。這是怎麼弄來的工作。
我首先做的就是用特殊字符的 URL 的 XML。然後我去掉從 XML 字符串的所有特殊字符。然後我將字符串轉換爲 NSdata 然後把 nsdata 對象傳遞給我的 NSXMLParser。因爲它有沒有更多特殊字符 NSXMLParser 是快樂。
這裏是爲任何人在將來可能會遇到的代碼。大感謝您對這篇文章作出了貢獻的人 !
NSString *address = @"http://www.google.com/ig/api?weather=Paris";
NSURL *URL = [NSURL URLWithString:address];
NSError *error;
NSString *XML = [NSString stringWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:&error];
//REMOVE ALL NON-ASCII CHARACTERS
NSMutableString *asciiCharacters = [NSMutableString string];
for (NSInteger i = 32; i < 127; i++)
{
[asciiCharacters appendFormat:@"%c", i];
}
NSCharacterSet *nonAsciiCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:asciiCharacters] invertedSet];
XML = [[XML componentsSeparatedByCharactersInSet:nonAsciiCharacterSet] componentsJoinedByString:@""];
NSData *data = [XML dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];