如何在Cocoa Touch中处理HTML字符串

时间:2010-04-13 08:01:54

标签: cocoa-touch string object

当我点击UITableViewCell<link>加载UIWebView或在该链接上打开Safari时,我正在使用RSS阅读器并正常工作。

但我真的想学习如何将主题内容加载到应用程序中,而不是显示整个站点或跳转到Safari

在每个<item>的RSS Feed中,有一个<body>标记(以及包含相同但已编码的<Description>)包含主题内容,如下图所示:

alt text http://www.balexandre.com/temp/2010-04-13_0953.png

所以,而不是抓住<link>我正在分配<body>。问题是它无法正常工作: - (

对于此示例,我只获得第一个<br>之前的内容。

  • 我在C#中使用NSString,如果我使用任何其他对象,是否有更好的对象用于此类数据?
  • 我应该使用UITextView加载此信息(因为它已经滚动)或者我应该使用UIWebView代替?

谢谢。


已添加

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            
    //NSLog(@"found this element: %@", elementName);
    currentElement = [elementName copy];
    if ([elementName isEqualToString:@"item"]) {
        // clear out our story item caches...
        item = [[NSMutableDictionary alloc] init];
        currentTitle = [[NSMutableString alloc] init];
        currentDate = [[NSMutableString alloc] init];
        currentSummary = [[NSMutableString alloc] init];
        currentLink = [[NSMutableString alloc] init];
        currentBody = [NSMutableString new];  // added by me
        currentCreator = [NSMutableString new];  // added by me
    }       
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
    //NSLog(@"ended element: %@", elementName);
    if ([elementName isEqualToString:@"item"]) {
        // save values to an item, then store that item into the array...
        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];
        [item setObject:currentBody forKey:@"body"]; // <----
        [item setObject:currentCreator forKey:@"dc:creator"];

        [stories addObject:[item copy]];
        NSLog(@"adding story: %@", currentTitle);
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    //NSLog(@"found characters: %@", string);
    // save the characters for the current item...
    if ([currentElement isEqualToString:@"title"]) {
        [currentTitle appendString:string];
    } else if ([currentElement isEqualToString:@"link"]) {
        [currentLink appendString:string];
    } else if ([currentElement isEqualToString:@"summary"]) {
        [currentSummary appendString:string];
    } else if ([currentElement isEqualToString:@"pubDate"]) {
        [currentDate appendString:string];
    } else if ([currentElement isEqualToString:@"body"]) {
        [currentBody appendString:string]; // <----
    } else if ([currentElement isEqualToString:@"dc:creator"]) {
        [currentCreator appendString:string];
    }
}

并传递给我的WebBrowser View我有:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic

int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];

NSString * storyContent = [[stories objectAtIndex: storyIndex] objectForKey: @"body"];

// load web view
[self showWebPage:storyContent]; // <-- Here (storyContent variable) I only have the content until the first <br> :-(
}

2 个答案:

答案 0 :(得分:0)

使用NSXMLParser检测<body></body>标记,然后将它们之间的所有内容都抓取到字符串中。

现在我可以看到你的代码,我可以看到你的错误。当您遇到<br />标记后,您将currentElement更改为@"br",这意味着您停止向currentBody添加字符。

答案 1 :(得分:0)

查看Apple的SeismicXML示例项目。它为您提供了如何使用NSXMLParser的一般概念,并且还编写了在其自己的线程中解析XML数据以允许用户仍然与UI交互。如果您正在寻找嵌套标记(即<body>中的<item>),您需要一个标记来判断您当前是否在<item>标记内。否则,您将解析所有<body>标记。

要解决您的第二个问题,这取决于您希望如何向用户提供此信息。如果您希望文本样式化,则需要使用UIWebView。否则,您可以删除所需内容,并通过UITableView或您在Interface Builder中创建的自定义视图进行分散。

修改:在看到您的上一条评论后,您需要创建一个标记(即insideBody)并检查foundCharacters:内的内容

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    //NSLog(@"found characters: %@", string);
    // save the characters for the current item...
    if(insideBody == YES) {
        [currentBody appendString:string];
    } else if ([currentElement isEqualToString:@"title"]) {
        [currentTitle appendString:string];
    } else if ([currentElement isEqualToString:@"link"]) {
        [currentLink appendString:string];
    } else if ([currentElement isEqualToString:@"summary"]) {
        [currentSummary appendString:string];
    } else if ([currentElement isEqualToString:@"pubDate"]) {
        [currentDate appendString:string];
    } else if ([currentElement isEqualToString:@"dc:creator"]) {
        [currentCreator appendString:string];
    }
}

您可能需要在didStartElement:didEndElement:中执行相同的操作,因为从foundCharacters:获取数据只会为您提供代码的内容而不是代码本身。