解析HTML iPhone

解析HTML iPhone,iphone,html,objective-c,xcode,Iphone,Html,Objective C,Xcode,我在服务器上有一个.html文件,我需要从中解析信息。没什么大不了的,只是 <html> <body> <p> some text </p> <p> some other text </p> </body> </html> 一些文本 其他一些文本 是否有一种方法可以将所有标记中的文本作为单独的对象放在一个数组中,以便在UITableView中显示它们?在tableViewCell中使用UIw

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

<html>
<body>

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

</body>
</html>

一些文本

其他一些文本


是否有一种方法可以将所有
标记中的文本作为单独的对象放在一个数组中,以便在UITableView中显示它们?

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

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

与其鼓励您找出解析html的最佳方法,不如建议您在web服务器上保留一个静态文件?有许多可用于iOS的JSON解析器库允许您获取所需的数据


这样做的一个副作用是,您将在下载时使用更少的带宽,解析速度更快,并且生成的代码对数据负载的更改也不那么脆弱。

与其鼓励您找出解析HTML的最佳方法,不如建议您在web服务器上保留一个静态文件?有许多可用于iOS的JSON解析器库允许您获取所需的数据


这样做的一个副作用是,您将在下载时使用更少的带宽,解析速度更快,生成的代码对数据负载的更改也不那么脆弱。

您可以使用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;
}
#导入
#进口
#进口
#进口
@接口NSString(HTMLPasser)
-(NSArray*)resultWithXPath:(NSString*)xpath;
@结束
@实现NSString(HTMLPasser)
-(NSArray*)resultWithXPath:(NSString*)xpath
{
htmlDocPtr doc=htmlParseDoc((xmlChar*)[[self-dataUsingEncoding:NSUTF8StringEncoding]字节],“UTF-8”);
xmlXPathContextPtr context=xmlXPathNewContext(doc);
xmlXPathObjectPtr xpathobj=xmlxpathValeExpression(错误的转换[xpath UTF8String],上下文);
xmlNodeSetPtr nodeset=xpathobj->nodesetval;
if(xmlXPathNodeSetIsEmpty(nodeset))
返回零;
NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]initWithCapacity:nodeset->nodeNr];
对于(int i=0;inodeNr;i++){
xmlNodePtr node=nodeset->nodeTab[i];
[结果添加对象:[NSString stringWithCString:(char*)xmlNodeGetContent(节点)编码:NSUTF8STRINGENCONDING];
}
xmlXPathFreeObject(xpathobj);
xmlXPathFreeContext(上下文);
xmlFreeDoc(doc);
返回[结果自动释放];
}
@结束
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSString*html=@”\
\
一些文字

\ 其他一些文本

\ \ "; NSArray*result=[html resultWithXPath:@”//p“]; NSLog(@“结果:%@”,结果); [池释放]; 返回0; }
您可以使用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;
}
#导入
#进口
#进口
#进口
@接口NSString(HTMLPasser)
-(NSArray*)resultWithXPath:(NSString*)xpath;
@结束
@实现NSString(HTMLPasser)
-(NSArray*)resultWithXPath:(NSString*)xpath
{
htmlDocPtr doc=htmlParseDoc((xmlChar*)[[self-dataUsingEncoding:NSUTF8StringEncoding]字节],“UTF-8”);
xmlXPathContextPtr context=xmlXPathNewContext(doc);
xmlXPathObjectPtr xpathobj=xmlxpathValeExpression(错误的转换[xpath UTF8String],上下文);
xmlNodeSetPtr nodeset=xpathobj->nodesetval;
if(xmlXPathNodeSetIsEmpty(nodeset))
返回零;
NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]initWithCapacity:nodeset->nodeNr];
对于(int i=0;inodeNr;i++){
xmlNodePtr node=nodeset->nodeTab[i];
[结果添加对象:[NSString stringWithCString:(char*)xmlNodeGetContent(节点)编码:NSUTF8STRINGENCONDING];
}
xmlXPathFreeObject(xpathobj);
xmlXPathFreeContext(上下文);
xmlFreeDoc(doc);
返回[结果自动释放];
}
@结束
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSString*html=@”\
\
一些文字

\ 其他一些文本

\ \ "; NSArray*result=[html resultWithXPath:@”//p“]; NSLog(@“结果:%@”,结果); [池释放]; 返回0; }
Look-in.Look-in.我不是控制服务器的人。如果你这样做了,我会是最好的方式,+1我不是控制服务器的人。如果你这样做了,我会是最好的方式,+1在我的tableviewcell中放置webview如何帮助我将p标记中的文本放入数组?不要将UIWebView放置在UITableViewCell中。UIWebView是一个非常沉重的对象,不适合同时运行多个实例。此外,我严重怀疑这是否行得通。因为您将本质上是一个UIScrollView(在web视图中)的内容粘贴在另一个UIScrollView(表视图)中的单元格中,滚动截取将变得混乱,无法工作。+1 for
TTStyledLabel
有一个基本的xhtml解析器,并使用three20样式表系统进行自定义的
UIView
呈现,与偶数链接。facebook应用程序就是这样做的……在我的tableviewcell中放置网络视图如何帮助我将p标记中的文本放入数组?不要将UIWebView放入UITableViewCell中。UIWebView是一个非常沉重的对象,不适合同时运行多个实例。此外,我严重怀疑这是否行得通。因为您将本质上是一个UIScrollView(在web视图中)的内容粘贴在另一个UIScrollView(表视图)中的单元格中,滚动截取将变得混乱,无法工作。+1 for
TTStyledLabel
有一个基本的xhtml解析器,并使用three20样式表系统进行自定义的
UIView
呈现,与偶数链接。facebook应用程序就是这样做的。。。