采用以下代码,我们有2个XML,第一个包含一些我们将链接到第二个的数据。在这之后,如果我想在第一个XML中添加一个元素,它就会被添加到第二个XML中,而只会添加到第二个XML中。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="init()">
<fx:Script>
<![CDATA[
private function init():void
{
var xml1:XML = <xml1>
<data>
<element id="1"/>
</data>
</xml1>;
var xml2:XML = <xml2>
<data/>
</xml2>;
trace("xml1:");
trace(xml1);
trace("xml2:");
trace(xml2);
trace("-------------");
xml2.data.appendChild(xml1.data.children());
trace("xml1:");
trace(xml1);
trace("xml2:");
trace(xml2);
trace("-------------");
xml1.data.appendChild(<element id="2"/>);
trace("xml1:");
trace(xml1);
trace("xml2:");
trace(xml2);
}
]]>
</fx:Script>
</s:Application>
预期结果将是:
xml1:
<xml1>
<data>
<element id="1"/>
<element id="2"/>
</data>
</xml1>
xml2:
<xml2>
<data>
<element id="1"/>
</data>
</xml2>
或者也许:
xml1:
<xml1>
<data>
<element id="1"/>
<element id="2"/>
</data>
</xml1>
xml2:
<xml2>
<data>
<element id="1"/>
<element id="2"/>
</data>
</xml2>
但结果如下:
xml1:
<xml1>
<data>
<element id="1"/>
</data>
</xml1>
xml2:
<xml2>
<data>
<element id="1"/>
<element id="2"/>
</data>
</xml2>
为什么?
答案 0 :(得分:2)
这很有趣,但我并不满足于我完全理解它。
XML是Actionscript中的真实对象。因此,当调用xml1.data.children()
时,您将返回对XMLList对象的引用。
然后将此XMLList添加到xml2
。它是对同一节点的引用,因此当您修改它时,我们希望所有引用都得到更新。
这是我不确定的:XML节点只能有一个父节点。因此,当您将xml1
中的节点添加到xml2
时,某些内容会丢失。
一种解决方案是复制节点,然后将副本而不是原始引用添加到xml2
:
var copy:XMLList = xml1.data.children().copy();
xml2.data.appendChild(copy);