2011-02-09 3 views
0

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

Вот урезанный пример того, с чем я работаю. У каждого узла есть дочерний элемент с именем «removeeme». Если его значение равно 1, я хочу удалить его из xml-файла. Если его что-то еще я хочу оставить. Метод удаления является дефолтным вызовом 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 длину до и после удаления цикл длина действительно отличается. По какой-то причине xmllist, передаваемый в xmllistcollection, является тем, у которого узел не удален. Не имеет смысла для меня.

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

        } 

       } 
+0

Я знаю, это звучит глупо, но вы уверены, что сохраните новый файл в конце? – Manatherin

+0

Я обновил свой вопрос, чтобы показать проблему более подробно. Я почти уверен, что xmllist, который я пытаюсь использовать, это тот, который я удаляю с – dubbeat

ответ

3

Yo

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

Когда элемент удален (например, индекс 2, когда j равно 2), следующий элемент в Списке заполняет пространство, оставшееся от удаленного элемента (например, индекс 3 becmoes index 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];      
    }     
} 
+0

, что имеет смысл. Спасибо, что объяснил это мне. Это сводило меня с ума – dubbeat

+1

Там должно быть множество программ, которые просто ждут неудачи на таком уровне :) – Ryan