NULL::something

Login via flickr, はてな, TypeKey.

2006-03-01

てきとう E4X

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

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

Inserted at 2006-03-01T15:10:04+09:00

Trackback URI: http://lowreal.net/logs/2006/03/01/1.trackback

NULL

RSS feed meter for http://lowreal.net/logs/latest

Alternates

  1. RSS 1.0
  2. Atom 1.0

Generated with Taglibro

この日記は Taglibro と呼ばれる XML ベースの XSLT をテンプレートとして使ったシステムを使っています。現在の Taglibro は Ruby, ruby-xslt, libxml-ruby による実装です。ソースコードはとりあえず公開していません。