I can't remember how this came up, but the other day I was talking to this girl about XML; it was a pretty engaging conversation, as you can probably well imagine. I was trying to explain the difference between a ColdFusion XML document object and an XML string when the question occurred to me - can you use ToString() to get a partial representation of an XML document object.
Traditionally, you can call ToString() on an entire ColdFusion XML document to get an XML string representation:
- #ToString( xmlDocumentObject )#
But, what about calling that on an individual XML node that is within the XML document. I gave it a go:
- <!--- Define our ColdFusion XML document object. --->
- <cfxml variable="xmlGirls">
- <!--- Get the third girl. --->
- <cfset arrNodes = XmlSearch( xmlGirls, "//girl[ 3 ]" ) />
- <!--- Get a pointer to the girl node. --->
- <cfset xmlGirl = arrNodes[ 1 ] />
- Output the string representation of JUST this node
- taken from the XML document.
- ToString( xmlGirl )
As you can see, we are calling ColdFusion's ToString() method on only the third girl element node in the XML document. Running this gives us the following output:
- <?xml version="1.0" encoding="UTF-8"?>
Pretty cool! Not only did it give us the string representation of the single XML node, it also gave us the XML document type.
NOTE: I modified the tabbing of the outputted string for easier reading.
Definitely did not know you could do that. Cool, and thanks for pointing it out!
No worries. Been doing a lot of XML learning lately.
Great tips, thanks for it.
Hi Ben, do you know of an easy way to strip the XML declaration or to get the string representation without the XML declaration?
I did this:
<cfset xmlString = ToString(xmlNode)>
<cfif xmlString contains "<?xml">
<cfset xmlString=ListDeleteAt(xmlString ,1,">")>
<cfset xmlString=Right(xmlString ,Len(xmlString )-1)>
It's ugly, but it seems to do the trick.
You can use a regular expression (regEx) to remove the declaration:
XmlString = REReplace( XmlString, "<\?xml[^>]*>", "", "one" )
That's a good solution. Thanks.
<cfset arrNodes = XmlSearch( xmlGirls, "//girl[ 3 ]" ) />
<!--- Get a pointer to the girl node. --->
<cfset xmlGirl = arrNodes[ 1 ] />
<cfset xmlGirl = XmlSearch( xmlGirls, "//girl[ 3 ]" ) />