如何在AS3中交换XML节点?

如何在AS3中交换XML节点?,xml,actionscript-3,Xml,Actionscript 3,如何更改节点在其父节点中的显示顺序?假设我想交换索引为5和4的节点 var XX:XML = <root> <node index="0" /> <node index="1" /> <node index="2" /> <node index="3" /> <node index="4" /> <node index="5" /> <node in

如何更改节点在其父节点中的显示顺序?假设我想交换索引为5和4的节点

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]);
UPD:以下代码考虑了我们发现的bug,适用于任何Flash播放器版本

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);
    }
}
var XX:XML=
交换节点(XX,4,5);
交换节点(XX,0,9);
trace(XX.toXMLString());
函数交换节点(目标:XML,indexa:int,indexb:int):void
{
//精神检查。
如果(!target)返回;
如果(indexa<0)返回;
if(indexb<0)返回;
if(indexa==indexb)返回;
var-anIndex:int;
//假设indexa必须小于indexb。
//只是为了我们自己的方便。
if(indexb=aList.length())返回;
var阳极:XML=aList[indexa];
var bNode:XML=aList[indexb];
var-abNode:XML=aList[indexb-1];
删除列表[indexb];
target.insertChildBefore(阳极,bNode)
如果(indexb-indexa>1)
{
删除[索引];
插入Childfter(abNode,阳极);
}
}
UPD:以下代码考虑了我们发现的bug,适用于任何Flash播放器版本

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);
    }
}
var XX:XML=
交换节点(XX,4,5);
交换节点(XX,0,9);
trace(XX.toXMLString());
函数交换节点(目标:XML,indexa:int,indexb:int):void
{
//精神检查。
如果(!target)返回;
如果(indexa<0)返回;
if(indexb<0)返回;
if(indexa==indexb)返回;
var-anIndex:int;
//假设indexa必须小于indexb。
//只是为了我们自己的方便。
if(indexb=aList.length())返回;
var阳极:XML=aList[indexa];
var bNode:XML=aList[indexb];
var-abNode:XML=aList[indexb-1];
删除列表[indexb];
target.insertChildBefore(阳极,bNode)
如果(indexb-indexa>1)
{
删除[索引];
插入Childfter(abNode,阳极);
}
}

我似乎理解您想要展示的内容,但您的代码在主题上不起作用。它只是在索引5之后插入索引4的副本,并将原始节点保留在索引4上,但不交换节点(当索引为4的节点到达索引5的位置,而索引为5的节点到达索引4的位置时)。@TimYusupov你真的尝试过吗?或者你只是看着它说“哦,不,那不行”?当然,我试过了。输出:
@TimYusupov For me我的代码(Flex SDK 4.6+AIR SDK 21)输出:好吧,我有过时的SDK版本,但方法的名称仍然
insertchildfter
并不意味着像交换这样的操作。奇怪。我似乎理解您想要显示的内容,但您的代码在主题上不起作用。它只是在索引5之后插入索引4的副本,并将原始节点保留在索引4上,但不交换节点(当索引为4的节点到达索引5的位置,而索引为5的节点到达索引4的位置时)。@TimYusupov你真的尝试过吗?或者你只是看着它说“哦,不,那不行”?当然,我试过了。输出:
@TimYusupov For me我的代码(Flex SDK 4.6+AIR SDK 21)输出:好吧,我有过时的SDK版本,但方法的名称仍然
insertchildfter
并不意味着像交换这样的操作。奇怪。