2016-01-20 3 views
0

Я работаю с RSS-каналами в своем приложении, в частности с отчетами Drudge. Я совершенно новичок в таких вещах, а также новичок в использовании Xcode's NSXMLParser. Кажется, что каждый канал представляет собой статью. Каждый фид представлен тегами <item></item>.iOS NSXMLParser - последовательно выводить URL-адрес источника изображения из XML-тега

В этих тегах есть описание сведений, содержащихся в тегах <description></description>. В описании, некоторые статьи могут иметь образ, связанный с этой статьей, как показано на следующем скриншоте:

enter image description here

Часть я выделил это изображение мне нужно получить (в частности, строку URL). Я могу описать каждую статью как NSMutableString, но как получить URL-адрес изображения при анализе XML с помощью NSXMLParser? Ниже мой код так далеко, как я получаю все это сделано:

@interface ViewController() <NSXMLParserDelegate, UITableViewDataSource, UITableViewDelegate> { 
    NSXMLParser *parser; 
    NSMutableArray *feeds; 
    NSMutableDictionary *item; 
    NSMutableString *title; 
    NSMutableString *link; 
    NSMutableString *description; 
    NSString *element; 
} 
. 
.(other code) 
. 
#pragma mark - NSXMLParserDelegate 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    element = elementName; 
    if ([element isEqualToString:@"item"]) { 
     item  = [[NSMutableDictionary alloc] init]; 
     title  = [[NSMutableString alloc] init]; 
     link  = [[NSMutableString alloc] init]; 
     description = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if ([element isEqualToString:@"title"]) { 
     [title appendString:string]; 
    } 
    else if ([element isEqualToString:@"feedburner:origLink"]) { 
     [link appendString:string]; 
    } 
    else if ([element isEqualToString:@"description"]) { 
     [description appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"item"]) { 
     NSString *filteredTitle = [title stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     NSString *filteredLink = [link stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     if (![filteredLink containsString:@"https://itunes.apple.com/"]) { 
      [item setObject:filteredTitle forKey:@"title"]; 
      [item setObject:filteredLink forKey:@"link"]; 
      [item setObject:description forKey:@"description"]; 

      [feeds addObject:[item copy]]; 
     } 
    } 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    [self.tableView reloadData]; 
} 

ПРОГРЕСС

До сих пор я добавил следующее в моем didEndElement методе:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"item"]) { 
     NSString *filteredTitle = [title stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     NSString *filteredLink = [link stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     if (![filteredLink containsString:@"https://itunes.apple.com/"]) { 
      [item setObject:filteredTitle forKey:@"title"]; 
      [item setObject:filteredLink forKey:@"link"]; 
      [item setObject:description forKey:@"description"]; 
      if ([description rangeOfString:@"img style"].location != NSNotFound) 
      { 

      } 

      [feeds addObject:[item copy]]; 
     } 
    } 
} 

Теперь, когда я знаю, что в описании есть строка img style, мне нужно получить src="whateverImageURL". Как использовать регулярное выражение для первого появления этого URL-адреса изображения?

ответ

0

После некоторых исследований, мне удалось решить мою проблему. Мне просто нужна была небольшая практика с использованием NSRange. Идея в моем случае заключается в том, что когда у меня есть описание, в котором есть NSString «img style», я знаю, что мне нужна первая строка src = «anyImageURL», которую я могу получить. в следующем коде:.!

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"item"]) { 
     NSString *filteredTitle = [title stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     NSString *filteredLink = [link stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     if (![filteredLink containsString:@"https://itunes.apple.com/"]) { 
      [item setObject:filteredTitle forKey:@"title"]; 
      [item setObject:filteredLink forKey:@"link"]; 
      [item setObject:description forKey:@"description"]; 
      if ([description rangeOfString:@"img style"].location != NSNotFound) { 
       NSString *finalImageURL; 
       NSRange startRange = [description rangeOfString:@"src=\""]; 
       finalImageURL = [description substringFromIndex:startRange.location]; 
       finalImageURL = [finalImageURL substringFromIndex:startRange.length]; 
       NSRange endRange = [finalImageURL rangeOfString:@"\""]; 
       finalImageURL = [finalImageURL substringToIndex:endRange.location]; 
      } 

      [feeds addObject:[item copy]]; 
     } 
    } 
} 
0

вы должны реализовать этот протокол

- (void)parser:(NSXMLParser *)parser foundAttributeDeclarationWithName:(NSString *)attributeName forElement:(NSString *)elementName type:(nullable NSString *)type defaultValue:(nullable NSString *)defaultValue; 

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

Позвольте мне знать, если это поможет вам :)

UPDATE

Вот код, который найти URL первого найденного IMG в данной строке

NSString *descriptionString = @"&lt;br&gt;&lt;tt&gt;&lt;font size=\"3\" color=\"blue\"&gt;&lt;b&gt;&lt;u&gt;LIST: 10 Worst Winter Storms in Washington History...&lt;/u&gt;&lt;/b&gt;&lt;/font&gt;&lt;/tt&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;font face=\"Arial\" size=\"1\"&gt;&lt;i&gt;(Top headline, 3rd story, &lt;a href=\"http://www.nbcwashington.com/news/local/Ten-Worst-Storms-in-DC-History-365815301.html\"&gt;link&lt;/a&gt;)&lt;/i&gt;&lt;/font&gt;&lt;hr style=\"height: 1px; border-style: none; color: #666666; background-color: #666666;\"/&gt;&lt;font face=\"Arial\" size=\"2\"&gt;Related stories:&lt;div class=\"related-links\" id=\"R:H1:S3\"&gt;&lt;a href=\"http://www.wunderground.com/US/DC/001.html#WIN\"&gt;BLIZZARD WARNING ISSUED FOR DC; BURBS UP TO 30\"...&lt;/a&gt;&lt;br&gt;&lt;a href=\"http://washington.cbslocal.com/2016/01/19/winter-is-finally-here-deep-freeze-and-snow-in-the-forecast/\"&gt;Mayor Requests Help From National Guard...&lt;/a&gt;&lt;br&gt;&lt;a href=\"http://www.accuweather.com/en/weather-news/snow-storm-travel-disruptions-aim-for-nyc-dc-boston-philadelphia-friday-saturday/54870622\"&gt;UPDATE...&lt;/a&gt;&lt;br&gt;&lt;a href=\"http://www.infowars.com/snowmaggedon2016-empty-store-shelves-as-panicked-shoppers-ransack-grocery-stores/\"&gt;Anxious Shoppers Ransack Grocery Stores...&lt;/a&gt;&lt;br&gt;&lt;a href=\"http://motherboard.vice.com/read/dark-web-users-are-worried-snowstorm-jonas-will-disrupt-their-deliveries\"&gt;Dark Web Users Fear Delivery Disruptions...&lt;/a&gt;&lt;br&gt;&lt;a href=\"https://www.washingtonpost.com/news/to-your-health/wp/2016/01/21/heres-why-some-people-drop-dead-while-shoveling-snow/\"&gt;Cold weather, shoveling form heart attack 'perfect storm'...&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/font&gt;&lt;br&gt;&lt;div class=\"feedflare\"&gt; &lt;a href=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?a=Mtf4NlmV8XU:vDGXzaysxPw:yIl2AUoC8zA\"&gt;&lt;img src=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?d=yIl2AUoC8zA\" border=\"0\"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?a=Mtf4NlmV8XU:vDGXzaysxPw:V_sGLiPBpWU\"&gt;&lt;img src=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?i=Mtf4NlmV8XU:vDGXzaysxPw:V_sGLiPBpWU\" border=\"0\"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?a=Mtf4NlmV8XU:vDGXzaysxPw:qj6IDK7rITs\"&gt;&lt;img src=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?d=qj6IDK7rITs\" border=\"0\"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?a=Mtf4NlmV8XU:vDGXzaysxPw:gIN9vFwOqvQ\"&gt;&lt;img src=\"http://feeds.feedburner.com/~ff/DrudgeReportFeed?i=Mtf4NlmV8XU:vDGXzaysxPw:gIN9vFwOqvQ\" border=\"0\"&gt;&lt;/img&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src=\"http://feeds.feedburner.com/~r/DrudgeReportFeed/~4/Mtf4NlmV8XU\" height=\"1\" width=\"1\" alt=\"\"/&gt"; 
NSString *stringWithoutWhiteSpace = [descriptionString stringByReplacingOccurrencesOfString:@" " withString:@""]; 
NSInteger srcLocation = [stringWithoutWhiteSpace rangeOfString:@"src="].location; 
if (srcLocation!= NSNotFound) { 
    NSString *firstSrcImg = [stringWithoutWhiteSpace substringFromIndex:srcLocation]; 
    NSArray *componment = [firstSrcImg componentsSeparatedByString:@"\""]; 
    NSString *url = componment[1]; 
    NSLog(@"%@", url); 
} 

я приглашаю вас попробуйте и скажите, ответит ли он на ваш вопрос ... я могу дать еще один код, вернуть все IMG URLs :)

Второго обновление Для примера я сделал здесь метод, который вы можете использовать:

- (NSString*) getNextURLFromString:(NSString*) str withURLTag:(NSString*) urlTag{ 
NSString *stringWithoutWhiteSpace = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; 
NSInteger srcLocation = [stringWithoutWhiteSpace rangeOfString:urlTag].location; 
if (srcLocation!= NSNotFound) { 
    NSString *firstSrcImg = [stringWithoutWhiteSpace substringFromIndex:srcLocation]; 
    NSArray *componment = [firstSrcImg componentsSeparatedByString:@"\""]; 
    NSString *url = componment[1]; 
    return url; 
} 
return nil; 
} 

для urlTag паров положить @"src=" и для str парам поместить значение описание тега

ОБНОВЛЕНИЕ N ° 3

здесь метод, который возвращает все изображения, где URL-адрес

- (NSArray*) getAllURLFromString:(NSString*) str withURLTag:(NSString*) urlTag{ 
NSMutableArray *result = [NSMutableArray array]; 
NSString *stringWithoutWhiteSpace = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; 
NSInteger srcLocation = [stringWithoutWhiteSpace rangeOfString:urlTag].location; 
if (srcLocation!= NSNotFound) { 
    NSString *firstSrcImg = [stringWithoutWhiteSpace substringFromIndex:srcLocation]; 
    NSArray *componment = [firstSrcImg componentsSeparatedByString:@"\""]; 
    if ([componment count]>1) { 
     NSString *url = componment[1]; 
     [result addObject:url]; 

     NSArray *nextComponent = [stringWithoutWhiteSpace componentsSeparatedByString:url]; 
     if ([nextComponent count]>1) { 
      [result addObjectsFromArray:[self getAllURLFromString:nextComponent[1] withURLTag:urlTag]]; 
     } 
    } 

    return result; 
} 
return result; 
} 

для urlTag паров поставило @"src="

и для str паров поместить значение описания тега

+0

Извините, но этот метод не был выполнен, когда я разобрал XML – Rafi

+0

вы можете дать мне адрес вашего RSS или просто тег описания, так что я могу сделать некоторые испытания –

+0

Конечно зрения -source: http: //feeds.feedburner.com/DrudgeReportFeed – Rafi

1

you'l должно сделать следующее in ur

foundCharacters: метод.

else if ([element isEqualToString:@"description"]) 
{ 
     [description appendString:string]; 
if ([description rangeOfString:@"img"].location != NSNotFound) 
    { 
     NSRange firstRange = [previewImage rangeOfString:@"src="]; 
     NSRange endRange = [[previewImage substringFromIndex:firstRange.location] rangeOfString:@" width=\""]; 
     NSString *finalLink = [[NSString alloc] init]; 
     finalLink = [previewImage substringWithRange:NSMakeRange(firstRange.location, endRange.location)]; 
     NSString *match = @"src=\""; 
     NSString *postMatch; 
     NSScanner *scanner = [NSScanner scannerWithString:finalLink]; 
     [scanner scanString:match intoString:nil]; 
     postMatch = [finalLink substringFromIndex:scanner.scanLocation]; 
     NSString *finalURL = [postMatch stringByAppendingString:@""]; 
     description = finalURL; 
    } 
    } 
} 
  • Поскольку в ур foundCharacters у уже получают описания тега и нужно искать текст в Уре описание массива, где и Append строки.
  • , что и может сделать путем сканирования всей строка затем сохранить требуемую подстроки в переменном ... т.е. Ur ссылке URL
  • переменной
  • Используйте firstRange, чтобы установить диапазон от того, где Уллу принять строку
  • и endrange переменного для установки текста до тех пор, пока вы не хотите, чтобы строка заканчивалась (в ур-регистре).

Здесь я сохраняю URL-адрес в файле previewImage.

Надеется, что это работает для и удач .....

+0

Что такое переменная previewImage?Я не вижу, чтобы он был инициализирован. – Rafi

+0

просто создайте и инициализируйте еще одну NSMutableString в методе didStartElement для хранения ссылки .... u также сохранит ее в переменной описания. , но его лучше иметь другую переменную ... – Shravan

+0

Я почти получил эту работу, но вы положили ее неправильно. Правильное место для того, чтобы делать то, что мне нужно, находится в методе 'didEndElement' – Rafi

 Смежные вопросы

  • Нет связанных вопросов^_^