【发布时间】:2011-01-23 04:08:22
【问题描述】:
我想我阅读了与这个问题相关的每一个网页,但我仍然找不到解决方案,所以我在这里。
我有一个不受我控制的 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:: 并使用 entityName 为“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 来做到这一点,所以如果你知道怎么做,请随时在这里写。
【问题讨论】:
-
附言。我知道 NSXMLParser 是 XML 解析器而不是 HTML 解析器,但我读到 libxml2 也存在同样的问题。 NSXMLParser 似乎比 libxml2 更容易学习,所以我首先尝试了这个,希望它能正常工作。如果没有解决方案,那么我将不得不切换到 libxml2...
-
正如下面 Griffo 所建议的,我用适当的字符替换了文本中的每个 html 实体,然后用 NSXMLParser 对其进行了解析。现在它正在工作,但我真的很想了解哪种方法是解决此类问题的更好方法。
-
我用 & & 符号的实体,至少对于多个“foundCharacters”调用而言,这是很痛苦的处理。
标签: iphone parsing nsxmlparser html-entities