Flex 递归删除XMLList中节点

这个问题思考了很久,写个很多种递归,也走了很多弯路,为了让你们也少走弯路。我把解决方法写下。

适合场景: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]会乱删。

你可能感兴趣的:(Flex)