I've blogged this before, but only as a side point. Since the question came in to me this morning I thought I'd mention it again in a new post. The question is simple - how do you return XML data in ColdFusion to be consumed by AJAX? (Or really any source.)

First off - if you want to return XML from a CFC method, you have to use returnType="xml". If you do not, the result will be WDDX encoded. Consider this method:


<cffunction name="test" returnType="string" access="remote" output="false">
	<cfset var xml = "">
	<cfxml variable="xml">
		<root>
		<people>ray</people>
		<people>jeanne</people>
		</root>
	</cfxml>
	<cfreturn xml>
</cffunction>

Viewed in your browser, the result is:


<wddxPacket version='1.0'><header/><data><string><?xml version="1.0" encoding="UTF-8"?><char code='0a'/><root><char code='0a'/><char code='09'/>
<char code='09'/><people>ray</people><char code='0a'/><char code='09'/>
<char code='09'/><people>jeanne</people><char code='0a'/><char code='09'/><char code='09'/></root></string></data></wddxPacket>

(Note, I added a line break or two so it wouldn't break the site layout.)

If you switch the returnType to XML, you then get:


<?xml version="1.0" encoding="UTF-8"?>
<root>
<people>ray</people>
<people>jeanne</people>
</root>

So far so good. Before I go on - a quick note. You have to actually return an XML string or XML object. You can't just return a query and expect the returnType="xml" to convert it for you. That would be nice probably.

What if you don't have ColdFusion 7? First - buy it and mention my name! If you must use ColdFusion 6, create a ColdFusion page called proxy.cfm. This CFM file will call your CFC and then return the XML. Here is an example taken from BlogCFC:


<cfcontent type="text/xml">	
<cfoutput>#queryToXML(entries, "entries", "entry")#</cfoutput>

In this case, I used a UDF to convert a query into an XML string. I use cfcontent to let the browser know XML is being returned. As a last step, I set up my AJAX front end to hit proxy.cfm instead of the CFC.