XMLをいじっていて不思議な現象が。下記のようなXMLを定義します。
var xml:XML =<itemlist><itemGroup name=”X”><itemGroup name=”XX”><itemGroup name=”XXX”><item name=”XXX001″ /><item name=”XXX002″ /><item name=”XXX003″ /><item name=”XXX004″ /><item name=”XXX005″ /></itemGroup></itemGroup><item name=”X-001″ /><item name=”X-002″ /></itemGroup></itemlist>;
この中のitemエレメントで@name=”XX001″のデータの親を参照すると、下記のようになります。これは問題なし。
trace(xml..item.(@name==”XXX001″).parent());—-<itemGroup name=”XXX”><item name=”XXX001″/><item name=”XXX002″/><item name=”XXX003″/><item name=”XXX004″/><item name=”XXX005″/></itemGroup>
次に同じ条件でitemエレメントを検索して、それを別XMLの子として追加します。
var xmlList:XMLList = xml..item.(@name==”XXX001″);var xml2:XML = new XML(“<top></top>”)for each (var item:XML in xmlList) {xml2.appendChild(item);}
xml2に対して、itemエレメントで@name=”XX001″のデータの親を参照すると、下記のようになります。これも問題なし。
trace(xml2..item.(@name==”XXX001″).parent());—-<top><item name=”XXX001″/></top>
この後に、元々のXML(xml)に対して、同じく親を参照すると・・・
trace(xml..item.(@name==”XXX001″).parent());—-<top><item name=”XXX001″/></top>
と、別XMLの親を参照してしまいます。該当エレメントを別XMLに追加してしまうと、元XMLの該当エレメントの参照も変わってしまうようなのです。
これってどういうことなんでしょうね???もっとも別XMLにしたいなら、XML.copy()で複製を作れって話ではあるんですけけど、ちょっと納得いかない感じです。