Разбор HTML iPhone - PullRequest
       3

Разбор HTML iPhone

1 голос
/ 18 июня 2011

У меня есть файл .html на сервере, с которого мне нужно проанализировать информацию.Ничего страшного, это просто

<html>
<body>

<p> some text </p>
<p> some other text </p>

</body>
</html>

Есть ли способ, которым я могу поместить текст во все теги <p> в массиве как отдельные объекты, чтобы я мог показать их в UITableView?

Ответы [ 3 ]

4 голосов
/ 18 июня 2011

Вы можете разобрать его с помощью libxml, вот пример, который я написал для вас:

#import <Foundation/Foundation.h>
#import <libxml/HTMLTree.h>
#import <libxml/HTMLparser.h>
#import <libxml/xpath.h>

@interface NSString(HTMLParser)
- (NSArray *)resultWithXPath:(NSString *)xpath;
@end

@implementation NSString(HTMLParser)

- (NSArray *)resultWithXPath:(NSString *)xpath
{
  htmlDocPtr doc = htmlParseDoc((xmlChar *)[[self dataUsingEncoding:NSUTF8StringEncoding] bytes], "UTF-8");
  xmlXPathContextPtr context = xmlXPathNewContext(doc);
  xmlXPathObjectPtr xpathobj = xmlXPathEvalExpression(BAD_CAST [xpath UTF8String], context);
  xmlNodeSetPtr nodeset = xpathobj->nodesetval;
  if (xmlXPathNodeSetIsEmpty(nodeset))
    return nil;

  NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:nodeset->nodeNr];

  for (int i=0; i<nodeset->nodeNr; i++){
    xmlNodePtr node = nodeset->nodeTab[i];
    [result addObject:[NSString stringWithCString:(char *)xmlNodeGetContent(node) encoding:NSUTF8StringEncoding]];
  }

  xmlXPathFreeObject(xpathobj);
  xmlXPathFreeContext(context);
  xmlFreeDoc(doc);

  return [result autorelease];
}

@end

int main (int argc, const char * argv[])
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSString *html = @"<html>\
  <body>\
  <p> some text </p>\
  <p> some other text </p>\
  </body>\
  </html>";

  NSArray *result = [html resultWithXPath:@"//p"];
  NSLog(@"result: %@", result);
  [pool release];

  return 0;
}
2 голосов
/ 18 июня 2011

Вместо того, чтобы побуждать вас выяснить, как лучше всего разбирать HTML, могу ли я предложить вместо этого оставить статический файл JSON на вашем веб-сервере?Для iOS доступно множество библиотек синтаксического анализа JSON, которые позволят вам получить необходимые данные.

Побочным эффектом этого является то, что при загрузке вы будете использовать меньшую пропускную способность, это будет выполняться быстрее,и полученный код будет менее хрупким к изменениям в ваших данных.

0 голосов
/ 18 июня 2011

Используйте UIwebView в вашем tableViewCell. Или я предлагаю использовать TTStyleLabel от Three20 Framework. Будет отображаться html, правильно проанализированный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...