1

次のコードを見てください。2 つの XML があります。最初の XML には、2 番目の XML にリンクするデータが含まれています。その後、最初の XML に要素を追加したい場合、その要素は 2 番目の XML に追加され、2 番目の 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 ノードは 1 つの親しか持つことができません。そのため、ノードを からxml1に追加すると、xml2何かが失われます。

1 つの解決策は、ノードをコピーしてから、元の参照ではなくコピーを に追加することxml2です。

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