Parsing RSS with CFMX
I came up with a code sample to parse RSS with CFMX today based on a question about CFMX XML functions on my local CFUG mailing list. It should do ok with RSS 2.0, and 0.91, and also well formed RSS 0.92. It won't work with RSS 1.0.
<cfhttp url="http://www.cfdev.com/newsrss.cfm" method="get" /> <cfset rss = XMLParse(cfhttp.filecontent)> <!--- get an array of items ---> <cfset items = XMLSearch(rss, "/rss/channel/item")> <cfdump var="#items#"> <cfset rssItems = QueryNew("title,description,link")> <!--- loop through the array of items ---> <cfloop from="1" to="#ArrayLen(items)#" index="i"> <cfset row = QueryAddRow(rssItems)> <cfset title = XMLSearch(rss, "/rss/channel/item[#i#]/title")> <cfif ArrayLen(title)> <cfset title = title.xmlText> <cfelse> <cfset title=""> </cfif> <cfset description = XMLSearch(items[i], "/rss/channel/item[#i#]/description")> <cfif ArrayLen(description)> <cfset description = description.xmlText> <cfelse> <cfset description=""> </cfif> <cfset link = XMLSearch(items[i], "/rss/channel/item[#i#]/link")> <cfif ArrayLen(link)> <cfset link = link.xmlText> <cfelse> <cfset link=""> </cfif> <!--- add to query ---> <cfset QuerySetCell(rssItems, "title", title, row)> <cfset QuerySetCell(rssItems, "description", description, row)> <cfset QuerySetCell(rssItems, "link", link, row)> </cfloop> <ul> <cfoutput query="rssItems"> <li><a href="#rssItems.link#">#rssItems.title#</a> - #rssItems.description#</li> </cfoutput> </ul>
You might also like:
- Parsing RSS 1.0 with ColdFusion MX - April 8, 2004
- RSS and XPath - April 8, 2004
- Foundeo's 2007 End of the Year Sale - December 21, 2007
- Apple still likes their RSS icon - January 10, 2006
- AJAX Tutorial with Prototype - December 13, 2005
- Simple Flex Tutorial - November 7, 2005
- SoloSub is for button addicts - October 6, 2005
- Howto Create an RSS 2.0 Feed - September 13, 2005
Out of curiosity (an please realize I just recently started working with RSS). Why don't you just use XSLT transformations to merely format the RSS as you see fit? Or are you trying to convert it for storage purposes? I am not sure of the benefits (execution time, etc.) of doing either, but I found in my recent work on a CF based Aggregator that XSLT was the easiest to do. The reason for this is that I wanted to be able to change the layout depending on the feed if necessary. Of course it defaults to a generic layout that will handle all forms of RSS.