Как обрабатывать HTML-строки в Cocoa Touch - PullRequest
0 голосов
/ 13 апреля 2010

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

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

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

альтернативный текст http://www.balexandre.com/temp/2010-04-13_0953.png

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

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

  • Я использую NSString, как я бы использовал в C #, должен ли я использовать какой-либо другой объект, есть ли лучший объект для использования с такими данными?
  • Должен ли я использовать 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 голосов
/ 13 апреля 2010

Взгляните на пример проекта 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 голосов
/ 13 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...