当我点击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>
之前的内容。
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> :-(
}
答案 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:
获取数据只会为您提供代码的内容而不是代码本身。