2016-01-20 18 views
0

我正在使用我的應用中的RSS源,特別是Drudge Report的。我對這類東西很陌生,同時也是使用Xcode的NSXMLParser的新手。每種飼料顯然都代表一篇文章。每個Feed由<item></item>標籤表示。iOS NSXMLParser - 始終如一地從XML標記中導出圖像源URL

在這些標籤以內,有關於<description></description>標籤所包含的信息的描述。在描述中,有些條款可能與該文章相關的圖像,如下面的截圖所示:

enter image description here

我強調的部分是我需要(特別是URL字符串)的圖像。我可以將每篇文章的描述導出爲NSMutableString,但是如何在使用NSXMLParser解析XML時如何派生圖像的URL?下面是我的代碼,至於我是如何得到這一切的實現:

@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"。如何使用正則表達式獲取此圖像網址的第一次出現?

回答

0

經過一番研究,我設法解決了我的問題。我只需要使用NSRange做一點練習。我的想法是,當我的描述中有NSString「img樣式」時,我知道我需要第一個「src =」whateverImageURL「字符串,我可以這樣做。在下面的代碼:!

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

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網址:)

第二次更新 因爲我在這裏做,你可以使用的方法實例的另一代碼:

- (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 PARAM把@"src=" 併爲str param放置描述標籤值

UPDATE 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 PARAM的方法把@"src="

,爲str PARAM把描述標籤值

+0

很抱歉,但每當我在解析XML – Rafi

+0

你可以給我你的RSS的URL或只是描述標籤,所以我可以做一些試驗,從來沒有執行這個方法 –

+0

當然視圖-source:http://feeds.feedburner.com/DrudgeReportFeed – Rafi

1

You'l已經做到以下幾點在你的

foundCharacters:method。

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ü已經獲得描述標籤 ü需要尋找在烏拉圭回合描述陣列的文字,其中u追加 的字符串。
  • u可以通過掃描整個字符串,然後存儲所需 子在一個變量...即烏爾URL鏈接
  • 使用firstRange變量設置從那裏ULL採取串
  • 範圍和結束範圍變量的範圍內做設置文本,直到你想要字符串結束的地方(在這種情況下,url)

這裏IM存儲URL在previewImage。

希望它對你有好運.....

+0

什麼是previewImage變量?我沒有看到它被初始化 – Rafi

+0

只是在didStartElement方法中創建並初始化一個NSMutableString來存儲鏈接.... 你也可以將它存儲在描述變量中。 但它更好地有一個不同的變量... – Shravan

+0

我幾乎得到了這個工作,但你把它放在錯誤的方法。正確的地方做我所需要的是在'didEndElement'方法 – Rafi