Question

I have an xml file that needs to updated. The user wants to be able to select the year and amount. What is the best way?

Thanks

<root>
<SGA>
<Year>2008</Year>
<Amt>940</Amt>
</SGA>
<SGA>
<Year>2009</Year>
<Amt>980</Amt>
</SGA>
<SGA>
<Year>2010</Year>
<Amt>1000</Amt>
</SGA>  
</root>
Was it helpful?

Solution

You probably want to use the 'contains' operator (Alejandro points out that that's not a strict match) a match in XPath. To execute XPath in Coldfusion, use the xmlSearch function on an XML object. The normalize-space() function trims leading and trailing whitespace (fixing, for instance the CR in the 2010 year node).

Because the XPath is matching the year node directly, we use the '/..' to fetch the year node's parent. This is if you wanted to operate on any of the other sibling nodes to year (for instance if there was also a "quantity" node or something).

<cfxml variable="foo">
<root>
<SGA>
<Year>2008</Year>
<Amt>940</Amt>
</SGA>
<SGA>
<Year>2009</Year>
<Amt>980</Amt>
</SGA>
<SGA>
<Year>2010
</Year>
<Amt>1000</Amt>
</SGA>  
</root>
</cfxml>


<cfset targetYear=" 2010">
<cfset newAmount=2000>

<cfdump var="#foo#">

<!--- returns an array of matching nodes. --->
<cfset bar = xmlSearch(foo,"/root/SGA/Year[normalize-space()='#trim(targetYear)#']/..")>

<cfdump var="#bar#">

<cfset bar[1].Amt.xmlText = newAmount>

<cfdump var="#foo#">

In a real application, you'd want to iterate over the results of the xmlSearch (bar in this case) as an array, as there exists the possibility to get 0 or more then 1 result.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top