我认为我已经阅读了与这个问题有关的每一个网页,但我仍然找不到解决方案,所以我来到这里。
我有一个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文件。您有关于此问题的任何想法吗?
更新(12/03/2010)。在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来完成这个问题的方法。如果您知道如何做,请随意在这里写出来。