1

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

这是为什么?

4

1 回答 1

2

这很有趣,但我不满意我完全理解它。

XML 是 Actionscript 中的真实对象。因此,当您调用时,xml1.data.children()您将获得对 XMLList 对象的引用。

这个 XMLList 然后被添加到xml2. 它是对与以前相同的节点的引用,因此当您修改它时,我们希望所有引用都得到更新。

这是我不确定的:一个 XML 节点只能有一个父节点。因此,当您将节点添加xml1xml2某些东西时,它会丢失。

一种解决方案是复制节点,然后将副本而不是原始引用添加到xml2

var copy:XMLList = xml1.data.children().copy();
xml2.data.appendChild(copy);
于 2012-05-24T18:06:31.927 回答