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を。