尽管调用“删除”,xml节点也不会删除

时间:2011-02-09 14:14:14

标签: xml flex flex3 e4x

我正在尝试使用delete关键字从xml文件中删除节点,它只是普通的不起作用。

这是我正在使用的一个精简的例子。每个节点都有一个名为“deleteme”的子节点。如果它的值等于1,我想从xml文件中删除它。如果还有其他我想留下的话。删除方法是deffinately 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()

修改

如果我在delete for循环之前和之后跟踪xmllist lenght,那么长度确实不同。似乎由于某种原因传递给xmllistcollection的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 个答案:

答案 0 :(得分:3)

您需要反向执行'for循环'。这适用于通过迭代循环删除任何集合/列表中的项目。

当一个项目被删除时(例如,当j为2时索引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];                     
    }                   
}