どうにも使い道が少ない E4X をちょっとメモる。

基本的に XPath (の省略記法) に似ているので、相違点とかあげつつみたいな。XPathE4X に似せるため省略記法を使います。省略しないと全然違う

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 のハンドラぐらいでしか使えなくてなんともかんとも。もちろん生成するのは自由なんだけど……

@ の働きがいまいちわからない。ちゃんと仕様読もう

  1. トップ
  2. e4x
  3. てきとう E4X
  1. トップ
  2. js
  3. てきとう E4X