3

NSXMLParserInvalidCharacterError#9

これは、奇妙な文字(単語からWebフォームにコピーして貼り付けた引用符など)をヒットしたときに発生するエラーです。私が使用しているフィードはエンコーディングを提供しておらず、彼らにそれを変更してもらうことを望んでいません。これが私がヘッダーで取得するすべてです:

<?xml version = "1.0"?> <rss version = "2.0">

フィードを解析するときに不正な文字について何ができますか?解析の前​​にデータをスイープしますか?APIに欠けているものはありますか?誰かがこの問題に対処しましたか?

4

3 に答える 3

7
NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

私の問題を修正しました...

于 2009-08-03T15:41:27.980 に答える
1

NSString-initWithData:encoding:メソッドはnil失敗すると返されるため、変換するエンコーディングが見つかるまで、次々にエンコーディングを試すことができます。これは、すべての文字を正しく変換することを保証するものではありませんが、フィードソースが正しくエンコードされたXMLを送信しない場合は、おそらくそれを使用する必要があります。

基本的な考え方は次のとおりです。

// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData 
                                           encoding:NSUTF8StringEncoding];

if (xmlString == nil) {
  // try the next likely encoding
  xmlString = [[NSString alloc] initWithData:xmlData 
                                     encoding:NSWindowsCP1252StringEncoding];
}

if (xmlString == nil) {
  // etc...
}

一般的で堅牢にするために、成功するまで次のことを行うことができます。

1.)HTTP応答のContent-Typeヘッダーで指定されたエンコーディングを試してください(存在する場合)

2.)応答データの先頭にバイト順マークがないか確認し、見つかった場合は、示されたエンコードを試してください

3.)最初の2バイトを見てください。空白文字または「<」とnul/zero文字の組み合わせを見つけた場合は、UTF-16を試してください(同様に、最初の4バイトをチェックしてUTF-32があるかどうかを確認できます)

4.)データの先頭をスキャンして<?xml ... ?>処理命令を探し、encoding='something'その中を探します。そのエンコーディングを試してください。

5.)いくつかの一般的なエンコーディングを試してください。データソースが英語の場合は、Windows Latin-1、Mac Roman、およびISOLatin-1を必ず確認してください。

6.)上記のいずれも機能しない場合は、127より大きいすべてのバイトを削除して(または「?」または別のASCII文字に置き換えて)、ASCIIエンコーディングを使用してデータを変換してみてください。

この時点でNSStringがない場合は、失敗するはずです。encodingNSStringがある場合は、処理命令で宣言を探す必要があります<?xml ... ?>(まだステップ4に行っていない場合)。そこにある場合は、そのエンコーディングを使用してNSStringをNSDataに変換し直す必要があります。そこにない場合は、UTF-8エンコーディングを使用して変換し直す必要があります。

また、CFStringConvertIANACharSetNameToEncoding()and関数は、ヘッダーまたは処理命令CFStringConvertEncodingToNSStringEncoding()からエンコード名に対応するNSStringEncodingを取得するのに役立ちます。Content-Type<?xml ... ?>

于 2009-08-20T09:34:01.040 に答える
0

次のように、そのエンコーディング行をxmlから削除することもできます。

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
于 2012-04-16T09:32:15.473 に答える