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 性能要高一点点。