SuperAdmin
SuperAdmin

Reputation: 548

Parsing the description of an RSS feed

In my app, I parse data such as "title," "link," "pubDate," and "description" from an XML of a Wordpress RSS feed. In the description of the RSS feed, there is the link to the featured image, followed by the description. I would like to put only the description in the text field, followed by the image in an image view. The only problem is, should I implement a HTML parser inside of my already existing NSXMLParser, or is there a simpler way? Can this be done within the NSXMLParser itself?

XML:

<item>
<title>Back-to-school issue of Blue and Gold in the mail</title>
<link>http://cazhigh.com/caz/gold/?p=2896</link>
<comments>http://cazhigh.com/caz/gold/?p=2896#comments</comments>
<pubDate>Thu, 29 Aug 2013 12:35:40 +0000</pubDate>
<dc:creator>...</dc:creator>
<category>...</category>
<category>...</category>
<category>...</category>
<guid isPermaLink="false">http://cazhigh.com/caz/gold/?p=2896</guid>
<description>
<![CDATA[
<img width="150" height="150" src="http://cazhigh.com/caz/gold/wp-content/uploads/2013/08/BluGold_BacktoSchool2013_cover-150x150.jpg" class="attachment-thumbnail wp-post-image" alt="Blue and Gold (Back to School 2013)" style="display: block; margin-bottom: 5px; clear:both;" />Be on the lookout for the September 2013 edition of the Blue and Gold newsletter, which should be arriving in the mail soon.  Included in the newsletter are district policies and notifications that we urge you to review, become familiar with and keep for your reference throughout the school year. The issue also provides some [&#8230;]
]]>
</description>
<content:encoded>
<![CDATA[
<img width="150" height="150" src="http://cazhigh.com/caz/gold/wp-content/uploads/2013/08/BluGold_BacktoSchool2013_cover-150x150.jpg" class="attachment-thumbnail wp-post-image" alt="Blue and Gold (Back to School 2013)" style="display: block; margin-bottom: 5px; clear:both;" /><div id="attachment_2898" style="width: 241px" class="wp-caption alignright"><a href="http://cazhigh.com/caz/gold/wp-file-browser-top/blueandgold/Blue%20and%20Gold%20(September%202013)"><img class="size-medium wp-image-2898 " alt="Blue and Gold (Back to School 2013)" src="http://cazhigh.com/caz/gold/wp-content/uploads/2013/08/BluGold_BacktoSchool2013_cover-231x300.jpg" width="231" height="300" /></a><p class="wp-caption-text">Blue and Gold (Back to School 2013)</p></div> <p itemprop="name"><span style="font-size: 13px;">Be on the lookout for the September 2013 edition of the Blue and Gold newsletter, which should be arriving in the mail soon. </span></p> <div itemprop="description articleBody"> <p>Included in the newsletter are district policies and notifications that we urge you to review, become familiar with and keep for your reference throughout the school year.</p> <p>The issue also provides some updates on work undertaken in Cazenovia schools — on everything from curricula to facilities — over the summer break, as well as &#8220;welcome back&#8221; messages from Superintendent of Schools Robert S. Dubik, Cazenovia High School Principal Eric Schnabl and Assistant Principal Susan Vickers, Cazenovia Middle School Principal Jean Regan and Burton Street Elementary Principal Mary-Ann MacIntosh.</p> <p>If you have questions related to the policies or notifications included in the newsletter, please call the district office at (315) 655-1317.</p> <p>The newsletter is also <span style="color: #000080;"><a title="link to Blue and Gold (September 2013)" href="http://cazhigh.com/caz/gold/wp-file-browser-top/blueandgold/Blue%20and%20Gold%20(September%202013)" target="_blank"><span style="color: #000080;"><b>available online</b></span></a></span>.</p> </div>
]]>
</content:encoded>
<wfw:commentRss>http://cazhigh.com/caz/gold/?feed=rss2&p=2896</wfw:commentRss>
<slash:comments>0</slash:comments>
</item>

Existing NSXMLParser Code:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
{

    classelement=elementName;

    if([elementName isEqualToString:@"item"])
    {
        itemselected=YES;
        mutttitle=[[NSMutableString alloc] init];
        mutstrlink=[[NSMutableString alloc] init];
        mutstrdate=[[NSMutableString alloc] init];
        mutstrdesc=[[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
{
    if([elementName isEqualToString:@"item"])
    {
        itemselected=NO;

        [titarry addObject:mutttitle];
        [linkarray addObject:mutstrlink];
        [datearray addObject:mutstrdate];
        [descarray addObject:mutstrdesc];

    }

}


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

        if ([classelement isEqualToString:@"title"])
        {
            [mutttitle appendString:string];
        }
        else if ([classelement isEqualToString:@"link"])
        {
            [mutstrlink appendString:string];
        }
        else if ([classelement isEqualToString:@"pubDate"])
        {
            [mutstrdate appendString:string];
        }
        else if ([classelement isEqualToString:@"description"])
        {
            [mutstrdesc appendString:string];
        }

    }
}

Upvotes: 0

Views: 492

Answers (1)

bzz
bzz

Reputation: 5596

Here you go

NSString *string = @"<![CDATA[<img width=\"150\" height=\"150\" src=\"http://cazhigh.com/caz/gold/wp-content/uploads/2013/08/BluGold_BacktoSchool2013_cover-150x150.jpg\" class=\"attachment-thumbnail wp-post-image\" alt=\"Blue and Gold (Back to School 2013)\" style=\"display: block; margin-bottom: 5px; clear:both;\" />Be on the lookout for the September 2013 edition of the Blue and Gold newsletter, which should be arriving in the mail soon.  Included in the newsletter are district policies and notifications that we urge you to review, become familiar with and keep for your reference throughout the school year. The issue also provides some [&#8230;]]]>";

NSScanner *scanner = [NSScanner scannerWithString:string];
NSString *imageString, *otherSthing, *descriptionString;
[scanner scanUpToString:@"src=\"" intoString:nil];
[scanner scanString:@"src=\"" intoString:nil];
[scanner scanUpToString:@"\"" intoString:&imageString];
[scanner scanUpToString:@"]]>" intoString:&otherSthing];
descriptionString = [otherSthing componentsSeparatedByString:@">"].lastObject;

The imageString is now http://cazhigh.com/caz/gold/wp-content/uploads/2013/08/BluGold_BacktoSchool2013_cover-150x150.jpg.

The descriptionString is Be on the lookout for the September 2013 edition of the Blue and Gold newsletter, which should be arriving in the mail soon. Included in the newsletter are district policies and notifications that we urge you to review, become familiar with and keep for your reference throughout the school year. The issue also provides some [&#8230;]

Upvotes: 2

Related Questions