我正在尝试使用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])
}
}
答案 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];
}
}