如何在AS3中交换XML节点?
如何更改节点在其父节点中的显示顺序?假设我想交换索引为5和4的节点如何在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
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
并不意味着像交换这样的操作。奇怪。