【问题标题】:Parse HTML iPhone解析 HTML iPhone
【发布时间】:2011-09-17 19:43:23
【问题描述】:

我在服务器上有一个 .html 文件,我需要从中解析信息。没什么大不了的,只是

<html>
<body>

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

</body>
</html>

有没有办法可以将数组中所有&lt;p&gt; 标记中的文本作为单独的对象放入,以便在 UITableView 中显示它们?

【问题讨论】:

标签: iphone html objective-c xcode


【解决方案1】:

你可以用 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】:

    与其鼓励您弄清楚如何最好地解析 HTML,我可以建议在您的 Web 服务器上保留一个静态的 JSON 文件吗?有许多适用于 iOS 的 JSON 解析器库可让您获取所需的数据。

    这样做的一个副作用是您将在下载中使用更少的带宽,解析速度会更快,并且生成的代码不会因数据负载的变化而变得脆弱。

    【讨论】:

    • 我不是控制服务器的人。
    • 如果你有的话会是最好的方法,+1
    【解决方案3】:

    在您的 tableViewCell 中使用 UIwebView。或者我建议使用three20 Framework 的TTStyleLabel。它将显示正确解析的 html。

    【讨论】:

    • 如何将 webview 放在我的 tableviewcell 中帮助我将 p 标签中的文本放入数组中?
    • 不要将 UIWebView 放在 UITableViewCell 中。 UIWebView 是一个非常重的对象,不适合同时运行的多个实例。此外,我严重怀疑这是否可行。因为您将本质上是 UIScrollView(在 Web 视图中)的东西粘贴在另一个 UIScrollView(表格视图)中的单元格中,所以滚动拦截会变得混乱并且不起作用。
    • +1 for TTStyledLabel 有一个基本的 xhtml 解析器,并使用 three20 样式表系统进行自定义 UIView 渲染,甚至链接。这就是 facebook 应用程序的作用......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-02-21
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多