XMLから取り出したエレメントの親への参照

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()で複製を作れって話ではあるんですけけど、ちょっと納得いかない感じです。

外部ファイル読み込みでswf/flvのファイルパスの違い

某所から「flvが再生できないので見て欲しい」と連絡があって(私が作ったものではない)、flaファイルを見たらコンポーネントにflvをリンクしているだけ。
いろいろ調べてみたら、flvのファイルパスの起点は、swfが貼ってあるHTMLではなく、swfになるらしい。いつのバージョンからだったか、外部読み込みのパスがswfからHTMLになったのは覚えていたけど、flvのパスがまた別だとは知らなかった。
※ちなみにコンポーネントのスキンはswfなのでHTML起点だけど、パブリッシュ設定でswfの出力先をサブフォルダにすると同じ場所に書き出されてしまう。この辺りは「ちょっとなあ」と思う。
フツーにHTMLとswfが同階層にあれば何もする必要はないし、サーバ絡みのコンテンツだとflv自体が別サーバだったりすることもあるからか、今まで問題に遭遇したことがなかったです。
う〜ん、わかっているようで気づいてないことがいろいろあるなあ。
下記サイトのお世話になりました。感謝。

親エレメント名を一括で取得

文字通り、特定のエレメントから遡って、全ての親エレメント名を取得するための関数を書きました。XMLは下層に向かっての処理はいろいろあるけど、上層に向かっての処理は少ない気がする。前提として、XMLは上から下に向かって使うものなのか? いや、そんなことないよね。単に階層化されたデータな訳だから。

//—————————
// 親ノード名取得(再帰)
//—————————
function getParentName_xml(xml:XML,array:Array):void
{
if (xml.parent() != undefined)
{
array.unshift(xml.parent().name());
getParentName_xml(xml.parent(),array);
}
}
前回の件みたいに単なる見落としの可能性もあるので、もっと簡便な方法を知ってる方は教えてください。

XMLから特定のエレメントを抽出(文字列で指定)

XMLをいじってて、XMLオブジェクトのすべての子孫(子、孫、ひ孫など)から特定のエレメントを抽出するには、descendant accessor(..)を使って
 
var resultList:XMLList = xml..aa;
 

と出来るのですが、このaaが文字列の場合にはどうすればいいか?

 
何かメソッドがあるはずだと探しまくって発見したのが、XML.descendants()でした。

var resultList:XMLList = xml.descendants(“aa”);

 

しかし散々探したあげく、見つけた場所がdescendant accessor(..)のヘルプにある関連項目からのリンクだったという・・・。灯台下暗しというけれど、ヘルプの見方に問題がありありです。うう…(T_T)。