もう少しだけ QName の話題を続けます。
QName と child() メソッド
child() や attribute() を呼ぶときに修飾名を使う必要があれば QName を引数として渡すことができます。以下のサンプルを使って具体的に見てみましょう。
var myOrder:XML = <foo:order xmlns:foo="http://www.sample.com/foo/"> <foo:item bar:id="1" quantity="1" xmlns:bar="http://www.sample.com/bar/"> <name>fresh burger</name> <price>300</price> </foo:item> </foo:order>;
まず foo:item に相当する QName のオブジェクトを作成します。これを引数にすることで child() を使っても foo:item を指定できるようになります。
var fooNS:Namespace = myOrder.namespace("foo"); var fooItemQN:QName = new QName(fooNS, "item"); trace(myOrder.child(fooItemQN).name()); // http://www.sample.com/foo/::item が出力される
ちなみに child() の箇所は以下のように書き換えることもできます。
// 以下の2行は同じオブジェクトを指す myOrder.child(fooItemQN); myOrder.fooNS::["item"];
QName と attribute() メソッド
attribute() も child() と同様に QName を使って修飾名を指定することができます。
var barNS:Namespace = myOrder.child(0).namespace("bar"); var barIdQN:QName = new QName(barNS, "id"); trace(myOrder.child(fooItemQN).attribute(barIdQN)); // 1 が出力される
attribute() も代わりになる書き方が幾つかあります。どれがお好みですか?
// 以下の3行は同じ属性を指す trace(myOrder.child(fooItemQN).attribute(barIdQN)); trace(myOrder.fooNS::["item"].@barNS::["id"]); trace(myOrder.fooNS::["item"].barNS::["@id"]);
コメントする