E4X(ECMAScript for XML) による XML のフィルタリングについてのメモ。
基本的使用法
以下のような XML データ foo があるとします。
var foo:XML = <words>
<word level="13">ひでぶ</word>
<word level="5">まにょまにょ</word>
<word level="15">いんたーねっつ</word>
<word level="8">げろしゃぶ</word>
<word level="3">ツンタカーメン</word>
<word level="12">いかゾルゲ</word>
<word level="20">あぼ</word>
<word level="1">シュミレート</word>
</words>;
- 属性level が10以上のものを列挙
属性を指定し、条件を満たすものを列挙した XMLList を返す。結果。trace( (foo.word.(@level>=10)) );
<word level="13">ひでぶ</word> <word level="15">いんたーねっつ</word> <word level="12">いかゾルゲ</word> <word level="20">あぼ</word>
- 属性level が10以上15未満のものを列挙
条件は真偽を返す式であれば、どんな形でも良い。結果。trace( (foo.word.(@level>=10 && @level<15)) );<word level="13">ひでぶ</word> <word level="15">いんたーねっつ</word>
問題と解決策
ここでもし、foo にこのような物が含まれていると、問題が発生します。
<word deleted="1"/>
[Fault] exception, information=ReferenceError: Error #1065: 変数 @level は定義されていません。
フィルター処理では、存在しない属性にアクセスするとエラーを起こしますが、これは「hasOwnProperty」で回避できます。
条件式の最初に「hasOwnProperty("@属性名")」を追加するだけです。
trace( (foo.word.(hasOwnProperty("@level") && @level>=10)) );
これで、「属性levelを持ち、levelが10以上のもの」を列挙出来るようになりました。

コメントする