Tim Yusupov
Tim Yusupov

Reputation: 37

How to swap XML nodes in AS3?

How can I change order in which nodes appear inside their parent? Let's say I want to swap nodes with index 5 and 4.

Upvotes: 0

Views: 150

Answers (1)

Organis
Organis

Reputation: 7316

var XX:XML =

<root>
    <node index="0" />
    <node index="1" />
    <node index="2" />
    <node index="3" />
    <node index="4" />
    <node index="5" />
    <node index="6" />
    <node index="7" />
    <node index="8" />
    <node index="9" />
</root>

var XL:XMLList = XX.children();

XX.insertChildAfter(XL[5], XL[4]);

var XXL:XMLList = XX.children();

trace(XX.toXMLString());

trace(XL[4] === XXL[4]);
trace(XL[4] === XXL[5]);
trace(XL[4] === XXL[6]);

P.S. Also, if you wondered how to remove a child node:

delete XL[0];

trace(XX.toXMLString());

UPD: The following code takes the bug we've found into account and works for any Flash Player version.

var XX:XML =

<root>
    <node index="0" />
    <node index="1" />
    <node index="2" />
    <node index="3" />
    <node index="4" />
    <node index="5" />
    <node index="6" />
    <node index="7" />
    <node index="8" />
    <node index="9" />
</root>

swapNodes(XX, 4, 5);
swapNodes(XX, 0, 9);
trace(XX.toXMLString());

function swapNodes(target:XML, indexa:int, indexb:int):void
{
    // Sanity checks.
    if (!target) return;
    if (indexa < 0) return;
    if (indexb < 0) return;
    if (indexa == indexb) return;

    var anIndex:int;

    // Lets say indexa must be < indexb.
    // Just for our own convenience.
    if (indexb < indexa)
    {
        anIndex = indexa;
        indexa = indexb;
        indexb = anIndex;
    }

    var aList:XMLList = target.children();

    // Last check.
    if (indexb >= aList.length()) return;

    var aNode:XML = aList[indexa];
    var bNode:XML = aList[indexb];
    var abNode:XML = aList[indexb - 1];

    delete aList[indexb];
    target.insertChildBefore(aNode, bNode)

    if (indexb - indexa > 1)
    {
        delete aList[indexa];
        target.insertChildAfter(abNode, aNode);
    }
}

Upvotes: 3

Related Questions