私はこの問題に関連するすべてのWebページを読んだと思いますが、それでも解決策を見つけることができないので、ここにいます。
自分の管理下にないHTMLWebページがあり、iPhoneアプリケーションから解析する必要があります。これが私が話しているウェブページのサンプルです:
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</HEAD>
<BODY>
<LI class="bye bye" rel="hello 1">
<H5 class="onlytext">
<A name="morning_part">morning</A>
</H5>
<DIV class="mydiv">
<SPAN class="myclass">something about you</SPAN>
<SPAN class="anotherclass">
<A href="http://www.google.it">Bye Bye è un saluto</A>
</SPAN>
</DIV>
</LI>
</BODY>
</HTML>
私はNSXMLParserを使用していますが、 èhtmlエンティティが見つかるまでうまくいきます。「ByeBye 」に対してfoundCharacters:を呼び出し、次に「egrave」のentityNameを使用してresolveExternalEntityName:systemID::を呼び出します。このメソッドでは、NSDataで変換された文字「è」を返すだけです。foundCharactersが再度呼び出され、前の文字列「Bye Bye」に文字列「è」が追加され、パーサーがNSXMLParserUndeclaredEntityErrorエラーを発生させます。
DTDがなく、解析しているhtmlファイルを変更できません。この問題について何か考えはありますか?
更新(2010年12月3日)。Griffoの提案の後、私は次のようなものになりました。
data = [self replaceHtmlEntities:data];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];
ここで、replaceHtmlEntities:(NSData *)は次のようなものです。
- (NSData *)replaceHtmlEntities:(NSData *)data {
NSString *htmlCode = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
NSMutableString *temp = [NSMutableString stringWithString:htmlCode];
[temp replaceOccurrencesOfString:@"&" withString:@"&" options:NSLiteralSearch range:NSMakeRange(0, [temp length])];
[temp replaceOccurrencesOfString:@" " withString:@" " options:NSLiteralSearch range:NSMakeRange(0, [temp length])];
...
[temp replaceOccurrencesOfString:@"À" withString:@"À" options:NSLiteralSearch range:NSMakeRange(0, [temp length])];
NSData *finalData = [temp dataUsingEncoding:NSISOLatin1StringEncoding];
return finalData;
}
しかし、私はまだこの問題を解決するための最良の方法を探しています。数日中にTouchXmlを試してみますが、NSXMLParser APIを使用してこれを行う方法があるはずだと思います。その方法を知っている場合は、ここに自由に書き込んでください。