@ledsun blog

無味の味は佳境に入らざればすなわち知れず

名前空間付きのXML

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