AS3/Flash:基于两个值的XML节点删除

AS3/Flash:基于两个值的XML节点删除,xml,actionscript-3,nodes,Xml,Actionscript 3,Nodes,我有删除特定节点的代码: var db: XML = <db> <entry> <Name>JAMES</Name> <Surname>MAILER</Surname> <Date>28/08/2013</Date> </entry> <entry> <Name>NATA<

我有删除特定节点的代码:

var db: XML = <db>
    <entry>
        <Name>JAMES</Name>
        <Surname>MAILER</Surname>
        <Date>28/08/2013</Date>
    </entry>
    <entry>
        <Name>NATA</Name>
        <Surname>KING</Surname>
        <Date>28/08/2013</Date>
    </entry>
    <entry>
        <Name>ROMAN</Name>
        <Surname>ALDA</Surname>
        <Date>28/08/2013</Date>
    </entry>
    <entry>...</entry>
</db>

clean();

function clean():void
{
var tempXML:XML = <db></db>;
var count:int = db.children().length();
trace (count);

for (i=0; i < count; i++)
{
    if (db.children()[i].Name == "JAMES" && db.children()[i].Surname == "MAILER")
    {
                    //do nothing
    }else{
        tempXML.appendChild(db.children()[i]);
    }
}
db = tempXML;
}
我可以避免使用“else”,但代码会删除所有以JAMES或MEX作为值的节点

“什么都不做”的剧本可以完成任务,但很难看

有没有更好的方法使用循环和简单比较

谢谢

和干杯。

使用“!”反转(非)条件的布尔值:

if (!(db.children()[i].Name == "JAMES" && db.children()[i].Surname == "MAILER"))
{
    tempXML.appendChild(db.children()[i]);
}

您可以为此使用E4X语法,例如:

..
const lookupXMLList : XMLList = db.*.(Name != "JAMES" && Surname != "MAILER");
trace("Result:", lookupXMLList.toXMLString());
..
但是,在您的情况下,最好的解决方案是删除无用的节点:

..
const removingXMLList : XMLList = db.*.(Name == "JAMES" && Surname == "MAILER");
for(var i : String in removingXMLList.*) delete removingXMLList[0];
trace("Result:", removingXMLList.toXMLString());
..

另一个解决方案。循环之前:

var test2:XML = dbase.copy();
if (test2.employee[i].Name == "JAMES" && test2.employee[i].Surname == "MAILER")
{
   delete test2.employee[i];
}
在循环内部:

var test2:XML = dbase.copy();
if (test2.employee[i].Name == "JAMES" && test2.employee[i].Surname == "MAILER")
{
   delete test2.employee[i];
}
我确实用过这个


谢谢dimpiax和djib。

谢谢djib!我确实使用了另一种方法,但你的方法也同样有效。两者都是很好的解决方案。