Mozilla は現時点では W3C の Document Object Model Load and Save に対応していない (バグ 155749) ので、DOM ツリーをシリアライズおよびデシリアライズするには次の Mozilla 専用のインターフェイスを使うのが最も簡単です。
- XMLSerializer - DOM ツリー を文字列またはファイルにシリアライズする
- DOMParser - XML を文字列から DOM ツリーにパースする
- XMLHttpRequest - XML を ファイルから DOM ツリーにパースする。
DOMParser
にはparseFromStream()
というメソッドがありますが、実際にはリモート (HTTP に限らず) と ローカルのファイルのどちらにも使用できる XMLHttpRequest を使った方が簡単です。
DOM ツリーを文字列にシリアライズする
まず、 DOM ツリーの作成 に書かれているとおりに DOM ツリーを作成します。
そうしたら、その DOM ツリー doc
を文字列にシリアライズしてみましょう。
var serializer = new XMLSerializer(); var xml = serializer.serializeToString(doc);
DOM ツリーをファイルにシリアライズする
まず、 DOM ツリーの作成 の記事に書かれているとおりに DOM ツリーを作成します。もし既に XMLHttpRequest を使用して DOM ツリーを取得しているなら、この節の最後まで読み飛ばしてください。
そうしたら、その DOM ツリー doc
をファイルにシリアライズしてみましょう。 (Mozilla でファイルを扱う方法についての詳細は Code_snippets:File_I/O を参照して下さい)
var serializer = new XMLSerializer(); var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance(Components.interfaces.nsIFileOutputStream); var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); // プロファイルフォルダを取得する file.append("extensions"); // extensions サブディレクトリ file.append("{5872365E-67D1-4AFD-9480-FD293BEBD20D}"); // あなたの拡張機能の GUID file.append("myXMLFile.xml"); // ファイル名 foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); // 書き込み、作成、切り詰め serializer.serializeToStream(doc, foStream, ""); // doc は DOM ツリーでしたね foStream.close();
XMLHttpRequest オブジェクトをファイルにシリアライズする
XMLHttpRequest を使用して既に DOM ツリーを取得している場合、上のコードの serializer.serializeToStream(doc, foStream, "")
を serializer.serializeToStream(xmlHttpRequest.responseXML.documentElement, foStream, "")
に置き換えて使用してください。xmlHttpRequest
は XMLHttpRequest
のインスタンスです。
このコードはまずサーバーから取得した XML をパースし、それからストリームに再シリアライズしていることに注意してください。何をしたいかにもよりますが、単純に xmlHttpRequest.responseText
を直接保存してもいいでしょう。
文字列を DOM ツリーにパースする
var theString='<a id="a"><b id="b">hey!</b></a>'; var parser = new DOMParser(); var dom = parser.parseFromString(theString, "text/xml"); // ルート要素名またはエラーメッセージを表示する dump(dom.documentElement.nodeName == "parsererror" ? "error while parsing" : dom.documentElement.nodeName);
ファイルを DOM ツリーにパースする
XMLHttpRequest
前述したように、DOMParser
には parseFromStream()
という名前のメソッドがありますが、XML ファイルを DOM ツリーにパースするのには XMLHttpRequest を使った方が簡単です (XMLHttpRequest
はローカルとリモート両方のファイルで機能します) 。次のコードは、ローカルの XML ファイルを読み込み、DOM ツリーにパースするサンプルです。
var req = new XMLHttpRequest(); req.open("GET", "chrome://passwdmaker/content/people.xml", false); req.send(null); // ルート要素名またはエラーメッセージを表示する var dom = req.responseXML; dump(dom.documentElement.nodeName == "parsererror" ? "error while parsing" : dom.documentElement.nodeName);
req.responseXML
は Document
のインスタンスです。
io.js
io.js を使いたければ、次のコードでファイルを DOM ツリーにパースすることもできます。XMLHttpRequest
とは違い、これはリモートのファイルは扱えません。
var file = DirIO.get("ProfD"); // %Profile% ディレクトリ file.append("extensions"); file.append("{5872365E-67D1-4AFD-9480-FD293BEBD20D}"); file.append("people.xml"); var fileContents = FileIO.read(file); var domParser = new DOMParser(); var dom = domParser.parseFromString(fileContents, "text/xml"); // ルート要素名またはエラーメッセージを表示する dump(dom.documentElement.nodeName == "parsererror" ? "error while parsing" : dom.documentElement.nodeName);