ECMAScript
for
XML

E4X

Mozilla 勉強会@東京 4th
2010-09-04

by teramako <teramako@gmail.com>

E4X 概要


    var x = 
      hoge
      piyo
    ;
    alert(x.item[0]); // hoge
  

みたいなことができる

E4X 概要 - 2

詳しいことは、前項の仕様か、E4X in Firefox 発表資料を読もう

E4X の変なところ

はまりポイントなど

XML_toString

名前空間がからむと、文字列化時に変なことになる

    default xml namespace = "";
    var x = <div xmlns="http://www.w3.org/1999/xhtml"/>
    x.appendChild(

non-namespace

); x.appendChild(

xhtml namespace

);

toString() すると...

    

non-namespace

xhtml namespace

空の名前空間を指定した部分が無くなってる。本来は下記のようになっているべき。

    

non-namespace

xhtml namespace

文字列化にバグがあるだけ

名前空間が上書きされているように見えるだけ

    x.*[0].name() // p == QName("", "p")
    x.*[1].name() // http://www.w3.org/1999/xhtml::p == QName("http://www.w3.org/1999/xhtml", "p")
  

XML_toString - 2

変な名前空間名が付く

    var ns = "http://www.w3.org/1999/xhtml";
    var x = <div xmlns={ns}>
      

hoge

</div>; x.ns::p.@class = "hogeClass";

ごく普通の操作ですね?

toString() すると...

    

hoge

XML_toString - 3

もう一つ

    var ns = "@mozilla";
    var x = <div xmlns={ns}>
      

hoge

</div>; x.ns::p.@class = "hogeClass";

ちょっと変な名前空間にしてみますよ...

toString() すると...

    

hoge

何ですか、この接頭辞は?

x.a === x.a ではない

    var x = 
      hoge
      piyo
    ;
  
    x.a === x.a // false
    x.a[0] === x.a[0] // true
  

特殊な内部メソッド[[Get]]

function 名前空間

Mozilla の独自拡張

    var x = 
      hoge
      foo
      xml element
    ;
  
    x.length // xml element
    x.function::length // function length() { [native code] }
  

function 名前空間 - フィルタ編

idbの要素を取りたいな

    var x = 
      hoge
      piyo
      fuga
    ;
  

フィルタを使って..

    x.list.(@id == "b");
    // ReferenceError: reference to undefined XML name @id
  

あー、もしかして、id属性を持っていないものがあるとエラーになる?
んじゃ、hasOwnPropertyメソッドを使って存在する場合...にすれば良いよね

    x.list.(hasOwnProperty("@id") && @id == "b");
    // <></>
  

W H Y ?

そこで、function名前空間

    x.list.(function::hasOwnProperty("@id") && @id == "b");
    // piyo
  

function 名前空間 - prototype拡張編

XML オブジェクトを prototype 拡張して使いやすく

    XML.prototype.function::toDOMNode = function toDOMNode(){
      // ...
    }
  

パフォーマンス

そんなの知りません。E4Xは扱いやさが全てです!

初期化

実験ページ

ノードの参照

実験ページ

要素追加

要素追加 - appendChild

実験ページ


    var x = 
; for (var i = 0; i < times; i++){ x.appendChild(hoge); }

要素追加 - +=演算子

実験ページ


    var x = <div/>;
    for (var i = 0; i < times; i++){
      x.* += hoge;
    }
  

要素追加 - xlist[i]に代入

実験ページ


    var xlist = new XMLList();
    for (var i = 0; i < times; i++){
      xlist[i] = hoge;
    }
    var x = 
{xlist}
;

Twitterのツイートで実験

実用面を考慮して、Twitterのツイートを50個作成し追加

実験ページ

DOM APIを使用した要素作成は気持ちが萎えて、やってません。すみません。


まとめ

ご清聴ありがとうございました
↓↓資料↓↓
http://teramako.github.com/doc/modest-20100904/index.html