2

NSXMLParser を (Michael Waterfalls MWFeedParser ライブラリを介して間接的に) 使用し、次の RSS フィードを解析する場合:

http://qdb.us/qdb.xml?action=latest

NSURL *feedURL = [NSURL URLWithString:@"http://qdb.us/qdb.xml?action=random"];
self.feedParser = [[MWFeedParser alloc] initWithFeedURL:feedURL];
self.feedParser.delegate = self;
self.feedParser.feedParseType = ParseTypeFull; // Parse feed info and all items
self.feedParser.connectionType = ConnectionTypeAsynchronously;
[self.feedParser parse];

フィード内の不正な文字のように見える無効な形式の xml ドキュメントを受け取りました。

http://validator.w3.org/check?uri=http%3A%2F%2Fqdb.us%2Fqdb.xml%3Faction%3Dlatest&charset=utf-8&doctype=Inline&group=0&user-agent=W3C_Validator%2F1.1

ドキュメントのエンコーディングを ISO-8859-1 から UTF-8 に変更しようとしましたが、それでも問題が発生します。

不正な文字を特定するにはどうすればよいですか? また、これらの不正な文字に遭遇したときに RSS フィードの解析が失敗しないようにするにはどうすればよいですか?

参考文献:(私がすでに調査したリンク)

Objective-C / Cocoa Touch での HTML 文字デコード

https://stackoverflow.com/users/106244/michael-waterfall

4

2 に答える 2

0

Enigma2 レシーバーの REST API から取得した EPG データを解析しているときに、このようなものを見つけました。この場合、1 つのサービスが不正な文字 0x05 を含む EPGInfo をプッシュしていました。
着信 NSData のクリーンアップ メソッドを実装しました。これは、パーサーに渡す前に NSURLSession から受け取った NSData からこれらの 0x05 バイトをフィルタリングする貧弱な方法です。

-(NSData *)DataCleaned:(NSData *)data {
   NSData *clean = nil;
   const char *old = (const char *)data.bytes;
   char *flt = (char *)calloc( data.length, sizeof( char ) );
   NSInteger cnt = 0;
   for( NSInteger i = 0; i < data.length; i++ ) {
      if ( old[i] != 0x05 )
         flt[cnt++] = old[i];
   }
   clean = [NSData dataWithBytes:flt length:cnt];
   free( flt );
   return clean;
}

私の場合、これで問題は解決しました。しかしもちろん、これには応答を解析する前に NSData にロードする必要があります。

于 2017-01-08T14:35:08.240 に答える
0

不正な文字を無視する方法はわかりませんが、解析する前に正規表現の修正を行ってそれらを削除することを検討するかもしれませんが、nsxmlparser の killxml インスタンスを使用することをお勧めします。これは不正な文字でも問題ない可能性があります iPhone プロジェクトに最適な XML パーサー」

于 2012-04-26T01:00:31.820 に答える