xml flex flex3 e4x

Los nodos xml no se eliminarán a pesar de llamar a "eliminar"



flex flex3 (1)

Estoy tratando de usar la palabra clave delete para eliminar nodos de un archivo xml y simplemente no funcionará.

Aquí hay un ejemplo simplificado de con lo que estoy trabajando. Cada nodo tiene un hijo llamado "deleteme". Si su valor es igual a 1, quiero eliminarlo del archivo xml. Si es algo más, quiero dejarlo. El método de eliminación es definitivamente obtener una llamada, pero no tiene ningún efecto.

<?xml version="1.0" encoding="utf-8"?> <stuff> <i> <deleteme> 0 </deleteme> </i> <i> <deleteme> 1 </deleteme> </i> <i> <deleteme> 0 </deleteme> </i> </stuff>

ActionScript

var xmlList:XMLList=_sourceXML.i; for (var j:int=0; j < _xmlList.length(); j++) { if (xmlList[j].deleteme== 1) { delete xmlList[j]; } } //breakpoint here. xmlList still contains nodes that should have been deleted xmlListColl=new XMLListCollection(xmlList); xmlListColl.refresh()

Editar

Si rastreé la longitud xmllist antes y después del ciclo de borrado, la duración es realmente diferente. Parece que por alguna razón el xmllist que se pasa a la colección xmllist es el que tiene el nodo no eliminado. No tiene ningún sentido para mí.

Editar 2

Lo siguiente da el resultado deseado. Sin embargo, me gustaría saber por qué el método anterior no funcionaba.

for (var j:int=0; j < xmlList.length(); j++) { //trace(xmlList[j].deleteme) if (xmlList[j].deleteme!=1 ) { //delete xmlList[j]; xmlListColl.addItem(xmlList[j]) } }


yo

Necesitas hacer el ''for loop'' en reversa . Esto sirve para eliminar elementos en cualquier colección / lista a través de un ciclo de iteración.

Cuando se elimina un elemento (por ejemplo, índice 2 cuando j es 2), el siguiente elemento de la Lista llena el espacio dejado por el elemento eliminado (por ejemplo, índice 3 becmodea índice 2), pero j aumenta a 3 y el elemento desplazado ( en el índice 2) se omite. Lo siguiente funcionará:

var _xmlList:XMLList=_sourceXML.i; for (var j:int=_xmlList.length() - 1; j >= 0 ; j--) { if (_xmlList[j].deleteme == 1) { delete _xmlList[j]; } }