2011-02-03 55 views
0

我正在使用ActionScript中的XML並試圖通過提供節點引用來找到一種方法來刪除節點。AS3,通過引用從XML中刪除節點

樣品:

var node:XML = 
<node> 
<child a="1" b="2" c="3" /> 
<child a="2" b="2" c="3" /> 
<child a="3" b="4" c="3" /> 
<child a="4" b="2" c="6" /> 
</node>; 

var targetChild:Xml = [email protected](a==1)[0]; 

目前,我使用下面來完成去除的節點。 另外我不想再次遍歷樹或過濾節點以找到我已經引用的targetChild。

delete (targetChild.parent().children()[targetChild.childIndex()]); 

不知何故,我只是不覺得這是一個非常乾淨的做法,但它的工作原理。 我想知道是否有另一種方法通過引用刪除節點?

回答

1

two ways two delete by reference

package { 
    /** 
    * ... 
    * @author www0z0k 
    */ 
    import flash.text.TextField; 
    import flash.display.Sprite; 
    import flash.text.TextFieldAutoSize; 
    public class FlashTest extends Sprite { 
     private var tf:TextField; 
     public function FlashTest() { 
      tf = new TextField(); 
      addChild(tf); 
      tf.multiline = true; 
      tf.autoSize = TextFieldAutoSize.LEFT; 

      var node:XML = new XML('<node><child a="1" b="2" c="3"/><child a="2" b="2" c="3"/><child a="3" b="4" c="3"/><child a="4" b="2" c="6"/></node>');    
      tf.appendText('before:\n' + node); 
      var xml1:XML = node.descendants('child').(@a == '3')[0]; 
      var xml3:XML = node.descendants('child').(@a == '1')[0]; 
      killXMLFromList(xml1, node.descendants(xml1.name())); 
      delete node.descendants(xml3.name()).(@a == xml3.attribute('a'))[0]; 
      tf.appendText('\nafter:\n' + node);   
     } 

     private function killXMLFromList(xml:XML, list:XMLList):void{   
      for (var i:int = 0; i < list.length(); i++) { 
       if (list[i] == xml) { 
        delete list[i]; 
       } 
      } 
     } 


    } 
} 
+0

對不起,示例可能不清晰。節點中沒有唯一標識符屬性。我已經在其他地方引用了目標節點,並且我不希望再次在樹上進行搜索/比較。 – Eatdoku 2011-02-03 20:15:55