Я думаю, что я читаю каждую отдельную веб-страницу, связанную с этой проблемой, но я все еще не могу найти решение для нее, так что я здесь.
У меня есть веб-страница 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="#" onclick="location.href='http://www.google.it'; return false;">Bye Bye è un saluto</A>
</SPAN>
</DIV>
</LI>
</BODY>
</HTML>
Я использую NSXMLParser, и он идет хорошо, пока не найдет объект & egrave; html. Он вызывает foundCharacters: для "Bye Bye", а затем он вызывает resolveExternalEntityName: systemID:: с именем entity "egrave". В этом методе я просто возвращаю символ "è", преобразованный в NSData, foundCharacters вызывается снова, добавляя строку "è" к предыдущей "Bye Bye", а затем парсер поднимает NSXMLParserUndeclaredEntityError ошибка.
У меня нет DTD, и я не могу изменить файл html, который я разбираю. У вас есть идеи по этой проблеме? Заранее благодарю всех вас, Роб.
Обновление (12/03/2010). После предложения Гриффо я закончил что-то вроде этого:
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, поэтому, если вы знаете, как это сделать, напишите здесь:)