这个问题思考了很久,写个很多种递归,也走了很多弯路,为了让你们也少走弯路。我把解决方法写下。
适合场景:xmlList中递归删除自身节点。
实例:
xmlList=<power name="视图" power_id="001" code="MONITOR_VIEW" state="unchecked" visible="true">
<power name="主机视图" power_id="001001" code="HOST_COMPUTER_VIEW" state="unchecked" visible="true"/>
<power name="定制视图" power_id="001002" code="BUSINESS_VIEW" state="unchecked" visible="true"/>
<power name="营业部视图" power_id="001005" code="SUBCORE_VIEW" state="unchecked" visible="true"/>
<power name="列表视图" power_id="001007" code="ALL_LIST" state="unchecked" visible="false"/>
</power>
<power name="监控" power_id="010" code="MONITOR_MENU" state="unchecked" visible="true">
<power name="监视器管理" power_id="002001" code="MONITOR_MANAGE_LIST" state="unchecked" visible="true"/>
<power name="模版管理" power_id="002006" code="MONITOR_TEMPLATE_MANAGE" state="unchecked" visible="true"/>
<power name="任务设置" power_id="005004" code="TASK_SETTING" state="unchecked" visible="true">
</power>
</power>
<power name="作业" power_id="100" code="JOB" state="unchecked" visible="false">
<power name="作业网管理" power_id="100001" code="JOB_NET_MANAGE" state="unchecked" visible="false"/>
</power>
删除方式:找到visible="false" 删除,检索过滤
实现:递归遍历
代码:
//一定要用索引,而且删除的对象要是XMLList里面的元素,不然会报错,或者不能删除
private function delNoVisibleNode(xmllist:XMLList):void
{
//for each (var item:XML in xmllist)
for (var i:int=xmllist.length() - 1; i >= 0; i--)
{
var item:XML=xmllist[i];
if ([email protected]() == "false" && item != null)
{
delete xmllist[item.childIndex()];
menuByVisibleFlaseXML.appendChild(item);
//删除符合条件的子节点: delete xml.children()(@type == “car” && @color == “red”);
}
else if ([email protected]() == "true")
{
if (item.hasComplexContent()) //有子节点
{
arguments.callee(item.children());
//delNoVisibleNode(item.children());
}
}
}
}
以上代码说明:首先使用delete以后xmllist的长度也在减少,如果用for each中循环的次数也减少了,导致节点没有删干净。所以解决是使用倒序从大到小删除。
其次删除的时候一定要用它的索引index.如果是使用xmlList[i]会乱删。