どうにも使い道が少ない E4X をちょっとメモる。
基本的に XPath (の省略記法) に似ているので、相違点とかあげつつみたいな。XPath は E4X に似せるため省略記法を使います。省略しないと全然違う。
var doc = <root> <foo>hoge</foo> <bar>huga</bar> <baz> <foo name="neko"> <bar>pqpq</bar> </foo> </baz> </root>;
doc.baz..foo
/root/baz//foo
- E4X ではルートノードがない。
doc..foo.(@name == "neko")
//foo[@name = 'neko']
- E4X では括弧の前にドットがいる。括弧の中は ECMAScript の式そのまま。すなわち
or
は||
,and
は&&
。 doc.*
/root/*
*
はそのままの意味。@*
もそのまま書ける。doc..foo[0]
//foo[1]
- 数値は普通の ECMAScript 配列とかとと同じように 0 基準。
doc..foo.length()
count(//foo)
- XPath の例はどうでもいいけど、数を知りたいときは
length()
を使う。括弧をつけずlength
と書くと length 要素を選択しようとするので注意が必要。
for each
とかいう構文がある (構文?)
for each (ele in doc.*) { // hoge }
XMLList とかいうオブジェクトがある。無名の要素をルートにして作る。ちょっときもい。
// XMLList (DOM の DocumentFragment みたいなの) var xmlList = <> <li>1</li> <li>2</li> <li>3</li> </>; var doc = <root> <li>999</li> </root>; doc.appendChild(xmlList); doc.toString() //=> <root> <li>999</li> <li>1</li> <li>2</li> <li>3</li> </root>
名前空間
var rssDoc = <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel rdf:about="http://example.com/"> <title>Example</title> <link>http://example.com/</link> <items> <rdf:Seq> <rdf:li rdf:resource="http://example.com/3"/> <rdf:li rdf:resource="http://example.com/2"/> <rdf:li rdf:resource="http://example.com/1"/> </rdf:Seq> </items> </channel> <item rdf:about="http://example.com/3"> <title>ex3</title> <link>http://example.com/3</link> <dc:date>2006-03-01T13:52:32+09:00</dc:date> </item> <item rdf:about="http://example.com/2"> <title>ex2</title> <link>http://example.com/2</link> <dc:date>2006-03-01T13:52:30+09:00</dc:date> </item> <item rdf:about="http://example.com/1"> <title>ex1</title> <link>http://example.com/1</link> <dc:date>2006-03-01T13:52:24+09:00</dc:date> </item> </rdf:RDF>; var rdf = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); var rdfs = new Namespace("http://www.w3.org/2000/01/rdf-schema#"); var rss = new Namespace("http://purl.org/rss/1.0/"); // var dc = new Namespace("http://purl.org/dc/elements/1.1/"); for each (i in rssDoc.rss::channel.rss::items.rdf::Seq.rdf::li) { var item = rssDoc.rss::item.(@rdf::about == i.@rdf::resource); alert(item.rss::title); }
見ればわかるように Namespace オブジェクト作って ::
を解決に使うみたい。使わないなら別に宣言しなくてもいい。あくまで E4X でアクセスするために名前をつける (=変数に代入する) ので、別にどんな名前でもいい。
var h = new Namespace("http://www.w3.org/1999/xhtml"); default xml namespace = h; var HtmlDoc = <html> <head> <title>E4X</title> </head> <body> <h1>for (;;)</h1> </body> </html>;
みたいなこともできるみたい。
XPath における following-sibling
軸のようなメソッドはないっぽい?とりあえず眺めてみたらないっぽい。よくわからん。
しかし、GreaseMonkey で E4X を使うにしても、XMLHttpReqeust のハンドラぐらいでしか使えなくてなんともかんとも。もちろん生成するのは自由なんだけど……
@
の働きがいまいちわからない。ちゃんと仕様読もう