2010-04-13 2 views
0

Я использую RSS-ридер и отлично работает, когда я нажимаю UITableViewCell для загрузки <link> либо в UIWebView, либо для открытия Safari по этой ссылке.Как обрабатывать HTML-строки в Cocoa Touch

Но я действительно хочу, чтобы узнать, как загрузить содержимое темы в приложение вместо показывая весь сайт или прыжок в Safari

В RSS корме на каждый <item> существует <body> тега (и <Description>, который содержит то же самое, но кодированный), который содержит тематическое содержание, как на картинке ниже показывает:

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

Таким образом, вместо того, чтобы поймать <link> я назначая <body>. Проблема заключается в том, что он не работает правильно :-(

для этого примера я только получить содержимое до первого <br> больше ничего.

  • Я использую NSString, как я хотел бы использовать в C#, должны Я использую любой другой объект, есть лучший объект для использования на таких данных?
  • должен ли я использовать UITextView, чтобы загрузить эту информацию (как это имеет свиток уже), или я должен использовать UIWebView вместо?

Th ank you.


добавил

- (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 Вид у меня есть:

- (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

Взгляните на образец проекта SeismicXML от Apple. Он дает общее представление о том, как использовать NSXMLParser, а также записывается для анализа данных XML в собственном потоке, чтобы пользователь мог по-прежнему взаимодействовать с пользовательским интерфейсом. Если вы ищете вложенный тег (т. Е. <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: только даст вам содержимое тегов и не сами теги.

+0

Я использую NSXMLParser уже получить УПС, это только для '' тега – balexandre

+0

Are вы используете NSMutableString для построения строки внутри тега ''? Если память используется, она должна продолжаться до закрытия тега (если только он не встречает тег, внутри которого вы разбираетесь в другом месте). – mgriepentrog

+0

добавил мой код ... Я использую NSMutableString: - / – balexandre

0

Использование NSXMLParser для обнаружения <body> и </body> теги, а просто захватить все, что между ними в строку.

Теперь, когда я вижу ваш код, я вижу вашу ошибку. Когда вы сталкиваетесь с тегом <br />, вы меняете currentElement на @"br", а это означает, что вы прекратите добавлять символы до currentBody.

+0

Я делаю, что уже - строка не содержит все, только до первого
ведьмы странно – balexandre