XML-узлы не будут удалены, несмотря на вызов «удалить» - PullRequest
0 голосов
/ 09 февраля 2011

Я пытаюсь использовать ключевое слово delete для удаления узлов из XML-файла, и оно просто не будет работать.

Вот урезанный пример того, с чем я работаю. У каждого узла есть дочерний элемент с именем "deleteme". Если его значение равно 1, я хочу удалить его из файла XML. Если это что-то еще, я хочу оставить это. Метод delete определенно вызывается gettig, но он не имеет никакого эффекта.

<?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()

Редактировать

Если я прослежу длину xmllist до и после цикла удаления for, длина действительно будет другой. Кажется, по какой-то причине xmllist, передаваемый в коллекцию xmllist, является тем, у которого не удален узел. Не имеет смысла для меня.

Редактировать 2

Следующее дает желаемый результат. Однако я все же хотел бы знать, почему первый метод не работал.

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])

                    }

                }

1 Ответ

3 голосов
/ 09 февраля 2011

Yo

Вам нужно сделать 'цикл for' в обратном порядке . Это касается удаления элементов в любой коллекции / списке с помощью итерационного цикла.

Когда элемент удаляется (например, индекс 2, когда j равен 2), следующий элемент в списке заполняет пространство, оставленное удаленным элементом (например, индекс 3 становится индексом 2), но j увеличивается до 3, и смещенный элемент (в индексе 2) пропускается. Будет работать следующее:

var _xmlList:XMLList=_sourceXML.i;

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