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];
}
}