e4x の落とし穴
AS3 になって XML に e4x でアクセスできるのが便利だったのですが、ちょっとした問題に遭遇しました。
node 名に catch (他にしらべたところ if、for、try なども) というパスが含まれる場合、ドットシンタックスでアクセスしようとするとコンパイルエラーになるというものです。namespace などを設定しても上手く動作せず、さらにリストでアクセスしても上手くアクセスできないという非常事態。
最終的には namespace を使用する場合はパスに直接 namespace を含めるとリストでアクセスできることが分かったのですが、ちょっと不便ですね。。
商品情報検索 API などでキャッチコピーなど catch というタグに格納されていることが多いと思うのですが、そのような XML を発見したら要注意です。
以下にまとめてみました。
// catch というノードが存在する場合、ドットシンタックスでアクセスするとコンパイルエラーになる var xml:XML = new XML("<test><catch>Flasher 募集中!</catch></test>"); trace(xml.catch); // コンパイルエラー :: 1084: シンタックスエラー : identifier が catch の前に必要です。 // リストでアクセスすると取得できる var xml:XML = new XML("<test><catch>Flasher 募集中!</catch></test>"); trace(xml["catch"][0]); // 出力 :: Flasher 募集中! // namespace を設定してもコンパイルエラーになる var xml:XML = new XML("<test xmlns="http://www.kayac.com\"><catch>Flasher 募集中!</catch></test>"); namespace ns = "http://www.kayac.com"; use namespace ns; trace(xml.catch); // コンパイルエラー :: 1084: シンタックスエラー : identifier が catch の前に必要です。 // namespace を設定した場合、リストでもアクセスできなくなる var xml:XML = new XML("<test xmlns="http://www.kayac.com\"><catch>Flasher 募集中!</catch></test>"); namespace ns = "http://www.kayac.com"; use namespace ns; trace(xml["catch"][0]); // 出力 :: undefined // namespace を直接パスに含めるとリストでもアクセスできる var xml:XML = new XML("<test xmlns="http://www.kayac.com\"><catch>Flasher 募集中!</catch></test>"); namespace ns = "http://www.kayac.com"; use namespace ns; trace(xml.ns::["catch"][0]); // 出力 :: Flasher 募集中!