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