Flex:向链接的XML添加元素

时间:2012-05-24 15:40:53

标签: xml flex actionscript hyperlink

采用以下代码,我们有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>

为什么?

1 个答案:

答案 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);