Flash E4Xでハイフンが含まれるXMLノードや属性を取得するメモ

FlashはE4XによるXMLの操作ができて便利なのですが、AS3内のコードと競合する文字列(例えばハイフン – )が含まれた場合、どうやって拾うか手間取ったのでメモします。

## 実際にはこんなXMLで困った ##

私の場合は、Tumblr API v1のAPIからXMLを取得したときに起こりました。

以下のXMLのphotoの部分を読みたかったのですが、photo-urlやmax-widthにハイフンが含まれていたわけですね。

<tumblr version="1.0">
    <tumblelog ... >
        ...
        <feeds>
            <feed ... />
            <feed ... />
            ...
        </feeds>
    </tumblelog>
    <posts>
        <post type="photo" ... >
            <photo-caption>...</photo-caption>
            <!-- ↓ここのコードを呼び出したい -->
            <photo-url max-width="500">...</photo-url>
            <photo-url max-width="400">...</photo-url>
            ...
        </post>

これをE4Xで呼び出すために以下のコードを書きました。

posts.post.( @type == "photo" ).photo-url.( @max-width == "500" )

しかし、ハイフンは引っかかってしまい以下のようにエラーが出てしまいました。

> 1176: 静的型 Number の値と、関連しない可能性が高い型 String の値とを比較しています。

これはまずい。

## 解決方法 ##

まず、photo-urlについてはタグを名指しで参照するため、配列アクセス演算子[]で解決できました。


posts.post.( @type == "photo" )[ "photo-url "].( @max-width == "500" );

しかし、まだ属性の@max-widthの参照がおかしいのでエラーが出てしまいます。

属性の@max-widthについては悩んだのですが、E4Xは自分の参照を与えて続けていることに着想して、カッコ内でattribute関数を使うことで解決しました。


posts.post.( @type == "photo" )[ "photo-url "].( attribute( "max-width" ) == "500" );

こういうことですね。


posts.post.( @type == "photo" )[ "photo-url"].( /**この中はEX4の捜索で絞りこまれたthis(photo-urlまでのXMLList)が入っている。*/ );

これで無事エラーなくパブリッシュが通りました。

## おわりに ##

自分でXMLを定義している場合はハイフンなんて避ける文字!という認識なので起こりにくいものです。

しかしあるサービス側が作っているAPIで、ハイフン入りの事態が起きると変更できないわけで、こちら側で対応しなければならず厄介ですね。
しかも、E4Xが使えないとなると、以前のchildNodesなどを使った参照に頼るので、かなり手間が増えてしまいます。今回の解決方法が見つかってよかったです。

それでは、よきFlash Lifeを。