我想我阅读了与这个问题相关的每一个网页,但我仍然找不到解决方案,所以我在这里。
我有一个不受我控制的 HTML 网页,我需要从我的 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 实体。它调用 foundCharacters: 表示“Bye Bye”,然后调用resolveExternalEntityName:systemID:: 实体名称为“egrave”。在这种方法中,我只是返回在 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 来做到这一点,所以如果你知道如何,请随时在此处编写。