2011-06-18 59 views
1

我在服務器上有一個.html文件,我需要從中解析信息。 It's沒有什麼巨大的it's只是解析HTML iPhone

<html> 
<body> 

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

</body> 
</html> 

有沒有一種方法,我可以把所有的數組作爲單獨的對象的<p>標籤文本,這樣我就可以在一個UITableView顯示嗎?

+1

查找到[的NSXMLParser(http://developer.apple.com/library/mac/#documentation/可可/參考/基金/班/ NSXMLParser_Class /參考/的reference.html)。 –

回答

-2

在您的tableViewCell中使用UIwebView。或者我建議使用three20 Framework的TTStyleLabel。它將顯示正確解析的html。

+1

如何在我的tableviewcell中放置webview幫助我將文本放入數組中的p標籤中? – Magnus

+2

請勿將UIWebView放入UITableViewCell中。 UIWebView是一個非常沉重的對象,不適合許多一次運行的實例。此外,我嚴重懷疑這甚至會起作用。因爲你在本質上是一個UIScrollView(在Web視圖中)在另一個UIScrollView(表格視圖)的單元格中,所以滾動截點會變得混亂並且不起作用。 –

+1

對於'TTStyledLabel',+1有一個基本的xhtml解析器,並使用three20樣式表系統做一個自定義的'UIView'渲染,甚至包含鏈接。這是如何Facebook應用程序... –

2

而不是鼓勵你找出如何最好地解析HTML,我可以建議只在你的web服務器上留下一個靜態的JSON文件嗎? iOS上有很多JSON解析器庫可供您獲取所需的數據。

這樣做的一個副作用是您將在下載中使用更少的帶寬,解析速度會更快,並且生成的代碼對於數據有效負載中的更改會變得更加脆弱。

+0

我不是在控制服務器的人。 – Magnus

+0

如果你有+1的話,最好的方法是 – Emil

4

你可以用的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; 
}