Conditionally remove multiple XML nodes in a loop?
XML.removeNode was removed for AS3s E4x, and now one simply uses delete (more).
Let's say I've got the following xml:
-
<items>
-
<item>a</item>
-
<item>b</item>
-
<item>c</item>
-
<item>d</item>
-
<item>b</item>
-
<item>f</item>
-
</items>
I'd like to delete all child nodes which do not have their node value set to "b". (there's two of them in that snippet).
Using a "for loop" and deleting items like : delete my_xml.item[i] fails, because the "array index" of nodes change as items are deleted (see code below).
No problem, just create a reference of the node, and delete it later:
var delete_later:XML=my_xml.item[i];
...but no, teh FAIL has come to visit you again! "delete_later" is not a reference to the node, it's just a placeholder for the value of that node. For the stubborn, trying to delete "delete_later" results in an error : "Attempt to delete the fixed property delete_later. Only dynamically defined properties can be deleted."
So what to do, what to do?
Simple, just loop through the array backwards!
Here's my test code:
-
var list:XML= <items>
-
<item>a</item>
-
<item>b</item>
-
<item>c</item>
-
<item>d</item>
-
<item>b</item>
-
<item>f</item>
-
</items>;
-
-
var test1:XML=list.copy();
-
for(var i:int=0;i<test1.item.length();i++){
-
if(test1.item[i]!="b")delete test1.item[i];
-
}
-
trace(test1);
-
/*
-
traces:
-
<items>
-
<item>b</item>
-
<item>d</item>
-
<item>b</item>
-
</items>
-
//NOT SO GOOD AL... NOT SO GOOD...
-
*/
-
-
-
var test2:XML=list.copy();
-
for(i=test2.item.length()-1;i>-1;i--){
-
if(test2.item[i]!="b")delete test2.item[i];
-
}
-
trace(test2);
-
/*
-
traces:
-
<items>
-
<item>b</item>
-
<item>b</item>
-
</items>
-
//WHOOOMP THERE IT IS!
-
*/



