Java/Rhino/E4X
E4Xの概要
-JavaScript言語にネイティブなXMLオブジェクトが導入された(DOM不要)
-XML文書リテラルをJavaScriptコードに埋め込むことが可能。
-正式な仕様はECMA357
–http://www.ecma-international.org/publications/standards/Ecma-357.htm
e4xのXMLオブジェクトの作り方
var b = new XML(a)
または
知っておくべき問題
現在のE4Xでは、XML文章のxml宣言をパースできない。
http://developer.mozilla.org/ja/docs/E4X
例
js: "<stdin>", line 14: uncaught JavaScript runtime exception:
TypeError: The processing instruction target matching
"[xX][mM][lL]" is not allowed.
at <stdin>:14
回避方法:
http://developer.mozilla.org/ja/docs/E4X
response = response.replace(‘<?xml version="1.0"?>’, ""); // bug 336551
var e4x = new XML(response);
超原始的!
E4Xクイックスタート
下のRhinoシェル操作例を順に読んでいけばE4Xの基本が理解できる。
js> xml.b
<b sort="1">b1</b>
<b sort="2">b2</b>
js> xml["b"]
<b sort="3">b1</b>
<b sort="2">b2</b>
js> xml.b.length();
2
js> xml.b[0]
b1
js> for(var i = 0; i < xml.b.length(); i++){
> print(xml.b[i])
> }
b1
b2
js> xml.b.@sort.length();
2
js> xml.b[0].@sort.length();
1
js> xml.b[0].@sort
1
js> xml..@sort.length();
2
js> xml.b[0].@sort=3
3
js> xml.toString()
<a>
<b sort="3">b1</b>
<b sort="2">b2</b>
</a>
js> xml.*.length();
2
js> xml..*.length();
4
js> xml.b[0].text();
b1
js> xml.toXMLString();
<a>
<b sort="3">b1</b>
<b sort="2">b2</b>
</a>
参照コピーと実体コピー
参照コピー(浅いコピー)
js> var xml2 = xml
js> xml2.b[0].@sort=3
3
js> xml
<a>
<b sort="3">b1</b>
<b sort="2">b2</b>
</a>
js> xml2
<a>
<b sort="3">b1</b>
<b sort="2">b2</b>
</a>
js>
実体コピー(深いコピー)
js> var xml2 = xml.copy();
js> xml2.b[0].@sort=10
10
js> xml
<a>
<b sort="1">b1</b>
<b sort="2">b2</b>
</a>
js> xml2
<a>
<b sort="10">b1</b>
<b sort="2">b2</b>
</a>
js>
XMLListオブジェクト
XMLListオブジェクトは、XMLの各要素を順序つきで格納するためのオブジェクトで、XMLオブジェクトに包括されている。
たとえば、XMLオブジェクトであるxmlという変数に対してxml.bとすれば、<b>タグ配下のオブジェクトを順序・階層を保持した状態で格納したXMLListオブジェクトが取得できる。
XMLListオブジェクトでは、length()メソッドが利用できるほか、+=演算子での要素の追加などを行うことができる。
js> xml.b += <b>b3</b>
<b>b1</b>
<b>b2</b>
<b>b3</b>
js>
要素の検索
js> xml.b.(@sort>1)
<b sort="2">b2</b>
<b sort="3">b3</b>
js> xml.b.(@sort>1).length();
2
js>
js> var filter = function(e){return e > 1}
js> xml.b.(filter(@sort))
<b sort="2">b2</b>
<b sort="3">b3</b>
js>
名前空間
js> xml.name()
http://example.com::a
js> xml.name().localName
a
js> xml.name().uri
http://example.com
js>
Java/Rhino/Rhinoのインストール
インストール
JDKのインストール
JDKをインストールします。
JDKのバージョンが1.6以上なら、標準でRhinoのバイナリが含まれているので、JDKをインストールすればセットアップは終了。
Rhinoのダウンロード
Rhinoのダウンロードページより、バイナリファイルを入手します。
http://www.mozilla-japan.org/rhino/download.html
ダウンロードしたzipファイルの解凍
ダウンロードしたzipファイルを解凍します。
いろいろなフォルダやファイルが含まれていますが、Rhinoの実行にはjs.jarを利用します。
EclipseでRhinoを実行するためのセットアップ
Javaプロジェクトの作成
メニューから、「ファイル」→「新規」→「プロジェクト」と進み、「Javaプロジェクト」を作成します。
プロジェクト名は何でもよし(ここではRhinoとする)

Rhinoライブラリの設定
プロジェクトを作ったら、libフォルダを作ってjs.jarを格納しました。

プロジェクト名を右クリックして、プロパティを選択。続けて「Javaのビルドパス」より、ライブラリの参照設定を行います。

Rhinoシェル(コンソール)実行の構成を作成
eclipseのコンソールでRhinoを実行できるようにします。
メニューから、「実行」→「構成および実行」を選択します。

新規の起動構成ボタンを押下して、新しい構成を作ります。
以下のように入力します。
‘共通
名前:Rhino Console(何でもよい)
「メイン」タブ
プロジェクト:Rhino(生成したプロジェクト名を入力)
メイン・クラス:org.mozilla.javascript.tools.shell.Main

入力が完了したら、適用ボタンを押下して設定を反映後、実行ボタンを押下すると、eclipseのコンソール上にRhinoシェルが立ち上がります。

quit()と入力後、エンターキーを押下するとRhinoシェルが終了します。
※JavaScriptなので、メソッド呼び出しの()を忘れて、単に「quit」と入力すると、quitメソッドのコードが表示されてしまいます。要注意。
再度実行する場合はプロジェクト名の上で右クリックして実行を選択後、先ほどの構成を実行します。
もうちょっと試したい人は、Rhinoシェル上で以下のコードを入力
ファイル実行の構成を作成
すばやい確認や簡単なデバッグ時には、前述のコンソールで実行すればよいのですが、少しまとまったコードを実行したい時には、あらかじめファイルに記述したコードを実行したいものです。
そこで、ファイルに記述したJavaScriptコードをRhinoですばやく実行できるような設定を行います。
まず、ファイルを作成します。プロジェクト上で右クリックして「新規」→「ファイル」を選択し、rhino.jsを生成します(ファイル名はなんでもよい)。

次に、このファイルを実行するための構成設定を行います。
メニューから、「実行」→「構成および実行」を選択します。

新規の起動構成ボタンを押下して、新しい構成を作ります。
以下のように入力します。
共通
名前:Rhino File(何でもよい)
「メイン」タブ
プロジェクト:Rhino(生成したプロジェクト名を入力)
メイン・クラス:org.mozilla.javascript.tools.shell.Main
「引数」タブ
プログラムの引数:-f rhino.js


入力が完了したら、適用ボタンを押下して設定を反映後、実行ボタンを押下すると、eclipseのコンソール上に実行結果が表示されます。
ためしにファイルに以下のコードを記述して実行してみましょう。
コンソールにhello worldと表示されます。

Eclipseを利用しない場合
コンソールの立ち上げ
js.jarをクラスパス配下に置いて、コンソールで
を実行すると、Rhinoのコンソールが立ち上がります。
ファイルの実行
ファイルを実行する場合は
とします。
Java/Rhino/Rhinoシェルのヘルプ
ヘルプの表示
Rhinoシェル上で以下のコードを入力すると、利用できるコマンドのヘルプが表示されます。
ヘルプ転載(Rhino1.7release120080306)
Command Description
======= ===========
help() Display usage and help messages.
defineClass(className) Define an extension using the Java class
named with the string argument.
Uses ScriptableObject.defineClass().
load(["foo.js", ...]) Load JavaScript source files named by
string arguments.
loadClass(className) Load a class named by a string argument.
The class must be a script compiled to a
class file.
print([expr ...]) Evaluate and print expressions.
quit() Quit the shell.
version([number]) Get or set the JavaScript version number.
gc() Runs the garbage collector.
spawn(arg) Evaluate function or scriptname on a new thread
sync(function) Creates a synchronized version of the function,
where the synchronization object is "this"
readFile(fileName [, encoding])
Returns the content of the file as a string.
Encoding of the string can be optionally specified.
readUrl(url [, encoding])
Similar to readFile, reads the contents of the url.
runCommand(name …) Runs a specified shell command. Additional arguments are
passed to the command
seal(args …) Seals the supplied objects
toint32(arg) Converts the argument into a 32-bit integer
serialize(obj, fileName)
Serializes an object and saves it to a file
deserialise(fileName) Reconstructs a serialized object
environment Returns the current environment object
history Displays the shell command history
For full description of all available commands see shell.html in
the docs directory of Rhino distribution.
js>

