. と ..
AS3 では XML データの階層構造をたどって目的の要素にアクセスするのに . オペレータと .. オペレータを使用することができます。
どちらを使用した場合も、返される値の型は XMLList (livedocs@lab) です。 XML クラスはルートノードを一つしか持ちませんが XMLList クラスは複数持つことができます。メソッドは両者共通です。
では、下のサンプルを使って具体的な使い方をみてみましょう。
var eList:XML = <employeeList> <employee id="1234"> <lastName>taro</lastName> <firstName>yamada</firstName> </employee> <employee id="2345"> <lastName>hanako</lastName> <firstName>yamada</firstName> <title>as3 programmer</title> </employee> </employeeList>
上記のコードで宣言された XML オブジェクト eList に対し、eList.employee は最上位のノード (employeeList) の子ノードで名前が employee のものを指します。上記の例ではそのようなノードが2つ存在するため eList.employee の値は2つの要素を持つ XMLList オブジェクトになります。
. (ドット) を繰り返すことで階層構造のさらに下を指定することができます。例えば eList.employee.lastName は、lastName という名前の要素が2つの employee それぞれに存在するため、やはり二つの要素を持つ XMLList オブジェクトになります。
.. アクセサを使用すると、階層の深さに関係なく関連する要素を取り出すことができます。例えば eList..lastName は eList オブジェクト内の lastName という名前の要素全てです。今回の例では eList.employee.lastName と同じ値になりますね。
さて、複数のノードが存在する場合、インデックス値を使って特定のノードを指定することができます。
eList.employee[0]; // 最初の employee ノード eList.employee[1]; // 2つ目の employee ノード
今回の場合、下の2つはどちらも hanako を指します。
eList.employee[1].lastName eList.employee.lastName[1]
なお、該当する要素が一つの場合インデックスは指定してもしなくても構いません。例えば eList.employee.title と eList.employee.title[0] は同じ要素を指します。
フィルターを用いた要素の指定
要素名の代わりに括弧内に条件を記述することでも要素を指定できます。以下に使い方の例を示します。要素名や属性の値を使って条件を記述します。
eList.employee.(lastName == "taro") // 最初の employee ノード eList.employee.(lastName == "taro").firstName // yamada eList.employee.(lastName == "taro").@id // 1234 eList.employee.(@id == 2345) // id が 2345 のノード eList.employee.(@id == 2345).lastName // hanako eList.employee.(@id > 1000) // 両方の employee ノード
要素の追加
. オペレータを使って要素を追加することができます。まず、次のような XML オブジェクトがあるとします。
var order1:XML = <order> <book> <title>learning AS3</title> </book> </order>
. オペレータで指定された新しい要素や属性に値を代入すると、XML オブジェクトが更新されます。
order1.book.@ISBN = 0123456789; order1.book.price = 1000; trace(order1); // 以下の内容が出力される <order> <book ISBN="0123456789"> <title>learning AS3</title> <price>1000</price> </book> </order>
コメントする