我想我会阅读与此问题有关的每一个网页,但我仍然无法找到解决方案,所以我就是这样。在iPhone上使用NSXMLParser解析html实体
我有一个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,它是顺利,直到它找到&egrave; html实体。它调用foundCharacters:for“Bye Bye”,然后调用resolveExternalEntityName:systemID ::,其中entityName为“egrave”。 在这种方法中,我只是返回在NSData中转换的字符“è”,再次调用foundCharacters,将字符串“è”添加到前一个“Bye Bye”,然后解析器提出NSXMLParserUndeclaredEntityError错误。
我没有DTD,我无法更改我解析的html文件。你对这个问题有什么想法吗?在此先感谢你们所有人, Rob。
更新(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来做到这一点,所以如果你知道如何,随时写在这里:
Ps。我知道NSXMLParser是一个XML解析器,而不是一个HTML解析器,但我读到libxml2存在同样的问题。 NSXMLParser似乎比libxml2更容易学习,所以我第一次尝试这个希望它工作。如果没有解决方案,那么我将不得不切换到libxml2 ... – Roberto 2010-03-03 11:50:39
正如下面的Griffo所建议的那样,我用合适的字符替换了文本中的每个html实体,然后使用NSXMLParser对其进行解析。现在它正在工作,但我真的很想知道哪个是解决这类问题的更好方法。 – Roberto 2010-03-04 07:37:49
我与符号字符“&”,至少对于多个“foundCharacters”调用,这是痛苦的应对&实体注意到这一点。 – 2018-03-07 21:09:45