利用 E4X解决 XML 处理的性能问题

http://www.blogjava.net/rosen/archive/2008/12/23/247983.html

要解决 XML 处理的性能问题。就应该好好的利用 E4X,尽量避免在解析 XML 的过程中使用循环。这里介绍几篇文章让大家了解下《E4X:出色的 JavaScript》、《E4X 教程》、《AS3中新的XML处理方法 – E4X》。E4X给我最大的便利就是..运算符。思考下面的XML:
var myXML:XML =
                 < groups  name ="大组" > 
                     < group  name ="小牛组" > 
                         < person  fullname ="rosenjiang" /> 
                         < person  fullname ="abc" /> 
                     </ group > 
                     < group  name ="柴鸡组" > 
                         < person  fullname ="rosenjiang" /> 
                     </ group > 
                     < group  name ="柴鸭组" > 
                         < person  fullname ="rosenjiang" /> 
                         < person  fullname ="rosen jiang" /> 
                     </ group > 
                     < group  name ="独立大队" > 
                         < person  fullname ="rosenjiang" /> 
                     </ group > 
                    </ groups > ;

要得到所有属性fullname是”rosenjiang”的person节点的个数怎么做?在没详细了解 E4X 之前,我会用 myXML.group 操作得到 group 的 XMLList 集合,然后再用循环去找寻每个 group 中 person 节点属性 fullname 为”rosenjiang”的数据:
               function on_click(): void {
                   var list:XMLList  =  myXML.group;
                   var count: int   =   0 ;
                    for (var i: int = 0 ; i < list.length(); i ++ ){
                       var persons:XMLList  =  list[i].person;
                        if (persons.length()  ==   1   &&  persons.@fullname  ==   " rosenjiang " ){
                           count  ++ ;
                       } else {
                            for (var j: int = 0 ; j < persons.length(); j ++ ){
                                if (persons[j].@fullname  ==   " rosenjiang " ){
                                   count  ++ ;
                               }
                           }
                       }
                   }
                   Alert.show(count + " 个 " );
               }

上面的写法的确很傻,下面是改进之后的代码,关键部分只有一行:
               function on_click(): void {
                   var list:XMLList  =  myXML..person.(@fullname  ==   " rosenjiang " );
                   Alert.show(list.length() + " 个 " );

               }
通过合理使用 E4X 语法,顺利的避免了循环带来的性能问题。过了几天,来个新的需求,需要统计出在这个 XML 中有几个不同姓名的 person。思考片刻,我可不可以用眼睛数出来啊?这里有 3 个...... 好吧,看来又是循环问题,第一个想到的是用两个嵌套 for 循环来进行排除处理,这是最直观的想法......
下面我介绍下如何用 ArrayCollection 并只使用一个循环来计算个数。由于 Flex 里面不支持 Map 类型,而我 Google 了一圈,且 RIACN 论坛上网友的 Map 实现性能都不行,遂打算用 ArrayCollection 模拟 Map 进行操作:
               import  mx.collections. * ;
               function on_click(): void {
                   var list:XMLList  =  myXML..person;
                   var ac:ArrayCollection  =   new  ArrayCollection();
                 for  each (var item:XML in list){
                    var fullname:String  =  item.@fullname;
                     if (ac.getItemIndex(fullname)  ==   - 1 ){
                        ac.addItem(fullname);
                    }
                }
                   Alert.show(ac.length + " 个 " );
               }

上面代码没什么过多解释,思路是取出一个 fullname 放进 ArrayCollection,然后判定下一个 fullname 是否存在于 ArrayCollection 中,如果存在就跳过,不存在就放进去再取下一个。另外我发现,使用 for each 比单纯的使用 for 性能要高一点点。

你可能感兴趣的:(JavaScript,xml,Google,Flex,J#)