Flex2からFlex3に移行する際に名前空間の設定されたXMLの取り扱いで注意が必要です。
XMLの取り扱い変更
XMLのノードを取得するにはActionScriptでは以下のようなコードを書きます。
var xml:XML = <person> <item>Head</item> <item>Body</item> <item>Arm</item> <item>Foot</item> </person> var item:XMLList = xml.item;
しかしXMLに名前空間が設定されている場合は、ノードを取得することができません。
※Flex2では名前空間が設定されていないXMLと同様にアクセスすることができました。
var xml:XML = <person xmlns="http://example.com/"> <item>Head</item> <item>Body</item> <item>Arm</item> <item>Foot</item> </person>
名前空間を意識した修正
この場合は名前空間を意識して以下のようなコードに修正するとノードを取得することができます。
var ns:Namespace = xml.namespace(); var item:XMLList = xml.ns::item;
またdescendantsメソッドやnameメソッドにも修正が必要です。
var item:XMLList item = xml.descendants("item")); //取得できない item = xml.descendants(new QName(xml.namespace(), "item")); //取得できる var name:String name = xml.name(); //http://example.com::person を取得 name = xml.localName(); //http://example.com::person を取得
名前空間そのものの削除
また名前空間を使用していない場合は、名前空間を削除してしまうと対応が簡単だと思います。
名前空間がノード名を修飾しているためXML.removeNamespaceメソッドでは削除することができません。
以下のような関数を作成すれば名前空間を削除したXMLに作り直すことができます。
public static function removeNamespace(xml:XML):XML{ return XML(xml.toXMLString().replace(xml.namespace(), "")); }
参考
この記事を書くには以下のサイトを参考にさせていただきました。
http://fladdict.net/blog/2006/07/as3_xml2.html
http://subtech.g.hatena.ne.jp/secondlife/20070211/1171120066