E4X では XML の名前空間も使用できます。ここで登場するNamespace クラス (livedocs@lab) は以前にアクセス制御の使用目的で紹介した名前空間の Namespace と同じものです。
今回は、以下のサンプルを使って名前空間で修飾された要素や属性へのアクセス方法を説明します。
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/"> <bar:name>fresh burger</bar:name> <price>300</price> </foo:item> <foo:item bar:id="2" quantity="1" xmlns:bar="http://www.sample.com/bar/"> <bar:name>french fries</bar:name> <price>170</price> </foo:item> </foo:order>;
前置修飾子で修飾された要素を扱うには、修飾子に対応する Namespace のインスタンスが必要です。例えば、上記の例では item に foo という前置修飾子付が付いていますが、これは item が何らかの名前空間に属していることを意味します。そのため修飾子情報なしで myOrder.item と記述しても存在しないノードを指すことになってしまいます。
そこで、まず以下のように foo に対応する名前空間のオブジェクト(ここでは fooNS)を取得します。取得には namespace() メソッドを使用します
var fooNS:Namespace = myOrder.namespace("foo"); trace(fooNS); // http://www.sample.com/foo/ が出力される
foo はルートノードで定義されているため myOrder から直接取得しています。名前空間のスコープ内のノードであればどのノードからも同様に名前空間のオブジェクトが取得できます
取得した名前空間オブジェクトは、後に :: を付けると要素名の修飾に使用できます。今回の例では fooNS::item と記述すると item 以下にアクセスすることができるようになります。
trace(myOrder.fooNS::item[0].@quantity); // 1 が出力される
次に、bar という名前空間も使用されていますので、これも扱えるようにします。bar は foo:item 要素で定義されていますので次のように Namespace オブジェクトを取得してみます。
var barNS:Namespace = myOrder.fooNS::item[0].namespace("bar"); trace(barNS); // http://www.sample.com/bar/ が出力される
これはちょっと長いので大変、という人は以下の方法でもOKです。この場合は URI がわかっている必要があります。
var barNS:Namespace = new Namespace("bar", "http://www.sample.com/bar/");
これで全ての要素が扱えるようになりました。
trace(myOrder.fooNS::item[0].@barNS::id); // 1 が出力される
trace(myOrder.fooNS::item[0].barNS::name); // fresh burger が出力される
コメントする