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

时间:2013-08-31 04:16:02

标签: xml actionscript-3 nodes

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

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来添加与条件语句不匹配的节点。

如果我使用:

if (db.children()[i].Name == "JAMES" && db.children()[i].Surname == "MAILER")

我可以避免使用“else”,但代码会删除所有具有JAMES或MEX值的节点。

“无所事事”脚本完成这项工作,但这很难看。

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

谢谢,

和欢呼。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以使用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());
..

答案 2 :(得分:0)

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

var test2:XML = dbase.copy();

循环内部:

if (test2.employee[i].Name == "JAMES" && test2.employee[i].Surname == "MAILER")
{
   delete test2.employee[i];
}

我确实使用过这个。

感谢dimpiax和djib。