« 自分のためだけではなく、誰かのために | Home | ドッキリ系 »

Mar 092008

EX4はまった

今まで独自で拡張したXMLクラスでXMLの処理をしていたのだけど、まぁ世の中の時流にのってみようと思い、E4X(PDF)に手を出してみた。

で、はまった。

たとえば

<order>
	<item id='1' price="100" star="4">
		<menuName>burger</menuName></item>
	<item id='2' price="200">
		<menuName>fries</menuName>
	</item>
</order>
こんなXMLを読み込んだとしてitemノードのattributes名が不確定の場合、これまではこのノードのattributes(Object)を取得してfor in でぶん回せば属性名と属性値を取得できたのだけど、E4Xで取得したXMLListだとちと違う。 たとえば
var _node = myXML.item[0];
var _attr = myXML.item[0].attributes();
for (var i in _attr) {
	trace(i,_attr[i]);
}
これだと
0 1
1 100
っツー感じ。つまりObjectではなくなんちゃってArray(lengthも使えるのだけど、プロパティでは無くmethodになってる) ということで名前は"name"でList内に格納されているのだけど、これがまた何故かmethod(いや、XMLを走査するわけだから何故かでもないんだけど・・。) ということで正解は
for (var i in _attr) {
	trace(_attr[i].name(),_attr[i]);
}

で疑問なのはこのやり方は早いのか?っツーことぐらいかな・・・。
Objectに一度変換してとり回しした方が早いようなきもするけどAVM2だと関係ないのか?
(setter使ったって実質内部でmethodな訳だし変わらない?)
なんかこれやるんだったら、value()とかのメソッドがあるとオデの頭では理解しやすいのだけど、まぁノードも属性も一括で管理しているから、その辺でのつじつまなんだろうな・・。

まぁこれまで使ってきたものとあまりに使い勝手が違うのでまだ違和感あるけど、
ノード名、属性名などがきちんと分かっている情報に対してのアクセスはとても簡単。
判定条件を内包できるもの素敵です。

最近JSONばっかりで、久しぶりにXMLを触ってはまったっつーことで、とりあえずメモ。


あ、ちなみに
var _attr = myXML.item[0].attributes();

var _attr = myXML.item[0].@*;
でもいいです。こっちで書くとなんかかっこいい気がする。

コメントにも書いていますが、たとえばattributesをそのまま何かしらのデータクラスに叩き込んで使用したい場合、これまでは
obj.params = node.attributes;(これはAS3ではXMLNodeクラス)
みちたいな感じでいけたんですが、E4Xだとname()で戻ってくるのがObjectであるため、toString()でStringに変換してやる必要があります。

(一応上記のXMLを踏襲しています)

var obj = {};
for (var i in _attr) {
	trace(_attr[i].name(),_attr[i]);
	obj[_attr[i].name().toString()]=_attr[i];
}
こんな感じ?

ちとめんどくさいな・・。
でもXMLDocumentもXMLNodeも推奨じゃないってことはE4Xの方が早いってことなのかいな?

2 Comments

いや、しかしもし何かしらのクラスにattributesをぶち込むときには昔のattributes:Objectの方が楽だったな・・・。
hogehoge.params = node.attributes;
の1行ですんでるじゃん。
っつーかなんかObjectに変換する方法ありそうだな・・。

うぉ・・・Objectに属性名で情報を叩き込もうとしたらエラーになった・・・。name()はObjectを返すから、toString()を通さないとあかんのか・・・。
めんどくさーー・・・。
追記しておこっと。

Leave a comment

Search and Archives