=====Reading RSS Feeds===== //by Tony Tooth and Richard Russell, Revised July 2009//\\ \\ There is a rapidly growing body of raw data available from certain sites, in the form of so-called [[http://en.wikipedia.org/wiki/RSS|RSS Feeds]] which can be downloaded and used within a BB4W application. **RSS** (**R**eally **S**imple **S**yndication) conveniently packages the data in an [[http://en.wikipedia.org/wiki/XML|XML wrapper]].\\ \\ Typically there are two steps required to use RSS data in your own program:\\ * Download the RSS data from the internet to a local disk file. * Extract the wanted information by parsing the contents of the XML file. \\ Downloading the RSS data can easily be achieved by calling the function **PROCurldownload** which can be found [[/Downloading%20a%20file%20from%20a%20URL|here]] (there are two versions of the procedure listed in that article; the second, longer, version may be more reliable). Extracting the wanted information from the file can be achieved by calling routines within the [[/Libraries|XMLLIB library]].\\ \\ RSS data is **hierarchical**, and the structure of the data is reflected in the structure of the XML file. If you want to examine what data is available in a particular RSS feed you can adapt the program **xml2tree** (available [[http://groups.yahoo.com/group/bb4w/files/WindowsAPI/xml2tree.bbc|here]]) by changing the URL to that of the feed you are interested in; the program displays the data as a **Tree View**.\\ \\ Here is a typical example of the hierarchy of the parts of an RSS feed in which you are most likely to be interested:\\ \\ <description> <item> <title> <description> <item> <title> <description> </code> To illustrate the process of downloading, extracting and using the data two examples follow; both make use of RSS feeds provided by the BBC.\\ \\ ==== Weather example ==== \\ The code below displays a summary of the weather forecast for the next three days (if you happen to live in Buckingham!):\\ \\ <code bb4w> INSTALL @lib$+"XMLLIB" url$ = "http://feeds.bbc.co.uk/weather/feeds/rss/5day/id/2688.xml" XMLfile$ = @tmp$+"temp.xml" PROCurldownload(url$, XMLfile$) PROC_initXML(xml{}, XMLfile$) rss% = FN_skipTo(xml{}, "rss", 0) IF rss% THEN channel% = FN_skipTo(xml{}, "channel", rss%) IF channel% THEN IF FN_skipTo(xml{}, "title", channel%) THEN PRINT FN_repEnt(FN_nextToken(xml{})) ENDIF WHILE FN_skipTo(xml{}, "item", channel%) item% = FN_getLevel(xml{}) IF FN_skipTo(xml{}, "title", item%) THEN PRINT 'FN_repEnt(FN_nextToken(xml{})) ENDIF ENDWHILE ENDIF ENDIF PROC_exitXML(xml{}) END </code> If you want a more detailed forecast you can include the 'description' data as well as the 'title':\\ \\ <code bb4w> INSTALL @lib$+"XMLLIB" url$ = "http://feeds.bbc.co.uk/weather/feeds/rss/5day/id/2688.xml" XMLfile$ = @tmp$+"temp.xml" PROCurldownload(url$, XMLfile$) PROC_initXML(xml{}, XMLfile$) rss% = FN_skipTo(xml{}, "rss", 0) IF rss% THEN channel% = FN_skipTo(xml{}, "channel", rss%) IF channel% THEN IF FN_skipTo(xml{}, "title", channel%) THEN PRINT FN_repEnt(FN_nextToken(xml{})) ENDIF WHILE FN_skipTo(xml{}, "item", channel%) item% = FN_getLevel(xml{}) IF FN_skipTo(xml{}, "title", item%) THEN PRINT 'FN_repEnt(FN_nextToken(xml{})) ENDIF IF FN_skipTo(xml{}, "description", item%) THEN PRINT FN_repEnt(FN_nextToken(xml{})) ENDIF ENDWHILE ENDIF ENDIF PROC_exitXML(xml{}) END </code> \\ ==== News example ==== \\ The code below lists the news headlines:\\ \\ <code bb4w> INSTALL @lib$+"XMLLIB" url$ = "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml" XMLfile$ = @tmp$+"temp.xml" PROCurldownload(url$, XMLfile$) VDU 14 PROC_initXML(xml{}, XMLfile$) rss% = FN_skipTo(xml{}, "rss", 0) IF rss% THEN channel% = FN_skipTo(xml{}, "channel", rss%) IF channel% THEN WHILE FN_skipTo(xml{}, "item", channel%) item% = FN_getLevel(xml{}) IF FN_skipTo(xml{}, "description", item%) THEN PRINT FN_repEnt(FN_nextToken(xml{}))' ENDIF ENDWHILE ENDIF ENDIF PROC_exitXML(xml{}) END </code> VDU 14 is used to pause the display at the end of each page until **Shift** is pressed.