Thursday, March 19, 2009
AS3/Flex - Find the minimum or maximum value for a specific node
While there are built in methods of sorting by a specific node in an XML file (using Sort, SortField, and the refresh function in ListCollectionView), it often fails to accomplish the task of sorting. I have found AS3's Array.sort and Array.sortOn to be more reliable when sorting numeric elements.
Given the following XML (save as test.xml): <?xml version="1.0" encoding="utf-8?> <rows> <row> <Department>DEPT 02</Department> <Element1>294</Element1> <Element2>244</Element2> </row> <row> <Department>DEPT 00</Department> <Element1>300</Element1> <Element2>851</Element2> </row> <row> <Department>DEPT 01</Department> <Element1>325</Element1> <Element2>465</Element2> </row> <row> <Department>DEPT 05</Department> <Element1>5464</Element1> <Element2>545</Element2> </row> <row> <Department>DEPT 04</Department> <Element1>348</Element1> <Element2>546</Element2> </row> </rows>
Find the maximum or minimum value for the node "Element1" or "Element2". Here's one way to do it using the sort function.
private function findValue(xmlData:XMLList, nodeName:String, options:Object=null):String { var coll:XMLListCollection = new XMLListCollection(xmlData.row[nodeName]); var tmp:Array = new Array(); for(var i:int = 0; i < coll.children().length(); i++) { tmp.push(coll[i]); } var sorted:Array = tmp.sort(options); return sorted[0]; }
Usage: trace("MAX Element1: " + findValue(xml, "Element1", Array.DESCENDING|Array.NUMERIC)); trace("MAX Element2 " + findValue(xml, "Element2", Array.DESCENDING|Array.NUMERIC)); trace("MIN Element1: " + findValue(xml, "Element1", Array.NUMERIC)); trace("MIN Element2: " + findValue(xml, "Element2", Array.NUMERIC));
Output: MAX SUBMITTED: 5464 MAX FILLED: 851 MIN SUBMITTED: 294 MIN FILLED: 244
Example MXML: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[
import mx.collections.XMLListCollection; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService; private function init():void { // load xml var service:HTTPService = new HTTPService(); service.resultFormat = HTTPService.RESULT_FORMAT_E4X; service.url = "test.xml"; service.addEventListener(ResultEvent.RESULT, resultHandler); service.addEventListener(FaultEvent.FAULT, errHandler); service.send(); } private function resultHandler(evt:ResultEvent):void { var xml:XMLList = new XMLList(evt.result); trace("MAX Element1: " + findValue(xml, "Element1", Array.DESCENDING|Array.NUMERIC)); trace("MAX Element2 " + findValue(xml, "Element2", Array.DESCENDING|Array.NUMERIC)); trace("MIN Element1: " + findValue(xml, "Element1", Array.NUMERIC)); trace("MIN Element2: " + findValue(xml, "Element2", Array.NUMERIC)); } private function findValue(xmlData:XMLList, nodeName:String, options:Object=null):String { var coll:XMLListCollection = new XMLListCollection(xmlData.row[nodeName]); var tmp:Array = new Array(); for(var i:int = 0; i < coll.children().length(); i++) { tmp.push(coll[i]); } var sorted:Array = tmp.sort(options); return sorted[0]; } private function errHandler(evt:FaultEvent):void { trace(evt.fault.message); } ]]> </mx:Script> </mx:Application>
|