Creating an RSS Feed Using <cffeed> with a Structure

The Adobe ColdFusion 8 documentation has a ton of great information on the <cffeed> tag, including a nice example of how to create an RSS feed using <cffeed> with a structure. There's no need to rehash that information, but I do want to expound on it to explain how you specify categories and enclosures as well as guid info for an item in a feed because I think specifying these for an item in a feed is a little tricky. So what I'm going to do is take the above example as a starting point, adding in the code that demonstrates how to specify categories and enclosures and guid info for an item and removing some non-essential code so as not to overly complicate things:

<cfsetting showdebugoutput="no">

<cfscript>
   /* Create the feed data structure and add the metadata. */
   myStruct = StructNew();
   myStruct.link = "http://" & CGI.HTTP_HOST & CGI.SCRIPT_NAME;
   myStruct.title = "My RSS Feed";
   myStruct.description = "A demonstration of <cffeed>";
   myStruct.pubDate = Now();
   myStruct.version = "rss_2.0";
   
   /* Add the feed items. A more sophisticated application would use dynamic variables
      and support varying numbers of items. */

   myStruct.item = ArrayNew(1);
   myStruct.item[1] = StructNew();
   myStruct.item[1].category = ArrayNew(1);
   myStruct.item[1].category[1] = StructNew();
   myStruct.item[1].category[1].value = "Cat1";
   myStruct.item[1].enclosure = ArrayNew(1);
   myStruct.item[1].enclosure[1] = StructNew();
   myStruct.item[1].enclosure[1].url = "http://" & CGI.HTTP_HOST & "enc/myenclosure.mp3";
   myStruct.item[1].enclosure[1].length = 1212;
   myStruct.item[1].enclosure[1].type = "audio/mp3";
   myStruct.item[1].description = StructNew();
   myStruct.item[1].description.value = "The first item in the feed";
   myStruct.item[1].guid = StructNew();
   myStruct.item[1].guid.isPermaLink = "Yes";
   myStruct.item[1].guid.value = "http://" & CGI.HTTP_HOST;
   myStruct.item[1].title = "Item 1";
   myStruct.item[2] = StructNew();
   myStruct.item[2].category = ArrayNew(1);
   myStruct.item[2].category[1] = StructNew();
   myStruct.item[2].category[1].value = "Cat1";
   myStruct.item[2].category[2] = StructNew();
   myStruct.item[2].category[2].value = "Cat2";
   myStruct.item[2].description = StructNew();
   myStruct.item[2].description.value = "The second item in the feed";
   myStruct.item[2].guid = StructNew();
   myStruct.item[2].guid.isPermaLink = "Yes";
   myStruct.item[2].guid.value = "http://" & CGI.HTTP_HOST;
   myStruct.item[2].title = "Item 2";
</cfscript>

<cffeed action = "create"
   name = "#myStruct#"
   xmlVar = "myXML">


<cfcontent type="text/xml" reset="true"><cfoutput>#myXML#</cfoutput>

Please note the following:

  • The code was specifically written without external dependencies so that it will work on any ColdFusion 8 installation.
  • <cfsetting showdebugoutput="no"> can be a lifesaver when working with <cffeed>--I was tearing my hair out for a bit until I had that head-slapping moment when it dawned on me why I kept being told by the browser that the feed was invalid.
  • I consider it good coding practice to always scope variables, even those in the Variables scope. The only reason the above code doesn't use scoped variables is to keep it as similar as possible to the example code referenced at the top of this post.
  • If you're looking for information on the metadata properties for the feed itself, see Ray Camden's blog post on the subject.

Comments
DeeAnn's Gravatar Preach it brotha josh! seriously, please post more. I'm fascinated!
# Posted By DeeAnn | 8/9/08 7:16 PM
Brett's Gravatar Nice post. This is exactly what I was looking for.
# Posted By Brett | 12/11/08 4:01 PM
Josh Adams's Gravatar @Brett--I am glad that my post helped you and I very much appreciate you taking the time to post a comment to let me know that it did help you.
# Posted By Josh Adams | 12/19/08 6:40 PM
Jonathan van Zuijlekom's Gravatar Thanks Josh, this put me in the right direction.
# Posted By Jonathan van Zuijlekom | 10/29/09 4:28 AM
todd sharp's Gravatar Hey Josh - the enclosure bit doesn't seem to work on CF 9 - have you tested it on 9 at all?
# Posted By todd sharp | 12/26/09 2:59 PM
todd sharp's Gravatar nevermind - user error ;)
# Posted By todd sharp | 12/26/09 3:02 PM
Ty Whalin's Gravatar Trying to figure out why you did just not use [currentRow] for the Array(1). It would eliminate the need to place secondary structures. Not sure what the advantage would be by creating it as separate structures for each item.
# Posted By Ty Whalin | 1/11/13 10:44 AM
Josh Adams's Gravatar @Ty: the reason I personally didn't use [currentRow] for Array(1) is stated at the beginning of the post: I started with the example on the Adobe site; if you check out that example, you'll see the same code used there. As to why Adobe wrote the code that way...your guess is as good as mine! Thanks for your suggestion of how to do it more efficiently!
# Posted By Josh Adams | 1/11/13 1:34 PM
Ty Whalin's Gravatar Right on, just seemed to make more sense that way. One thing I thought of though. I am using a cfloop query with the structures placed inside the cffloop. They may have also been just trying to show how to only output two items as shown with [1] or [2] as separate items as well. This seems like it would be appropriate since they were not utilizing a cfloop which would allow for a start and end.

Have been working on a Twitter Feed and a Direct Feed for a content management system I created and wanted to gain complete control of the feeds. Especially since FeedBurner has been said to be going away in the near future. Got about three day's worth of research and coding wrapped up with the cffeed tag. One of the most useful tags yet. Thanks for the response.
# Posted By Ty Whalin | 1/11/13 1:51 PM
# Posted By usps tracking | 3/18/17 2:34 PM
# Posted By nelnet | 3/24/17 9:15 AM
# Posted By fedex | 3/24/17 3:24 PM
BlogCFC was created by Raymond Camden. This blog is running version 5.9.002. Contact Blog Owner