parser:parseErrorOccurred31#parser:parseErrorOccur

3919 ワード

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

GB 2312またはGBKで符号化されたページは、まずgbで符号化して復号し、その中のgb文字列を置き換え、utf 8でdataに符号化してparserに与えることで中国語のページを解析することができる.

NSXMLParserは特殊文字に遭遇した後に解析を停止します


Googleの天気apiからXMLファイルを読み、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

問題は、パリのe deフランスのため、「都市データ」に達するまですべてのタグを分析し、停止する名前にascii以外の文字があることです.postalのように処理されませんコードのラベル.緯度、経度など.
そこで私の質問は、返された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];