Parsing and serializing XML
出典: MDC
Mozilla は現時点では W3C の Document Object Model Load and Save に対応していない (bug 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);
[編集] 資料
- Sarissa - Sarissa は、クライアントサイドの XML 操作のためのクロスブラウザ ECMAScript ライブラリで、URL または 文字列からの XML の読み込み、XSLT 変換の実行、XPath によるクエリなどといった機能を搭載しています。Gecko (Mozilla、Firefoxなど)、IE、KHTML (Konqueror、 Safari) をサポートしています。もし XUL アプリケーションと HTML ページの両方で使う JavaScript を書いており、その HTML ページがGecko ベースではない (Internet Explorer、Opera、Konqueror、Safari などの) アプリケーションで閲覧される可能性があるなら、XML をパース/シリアライズするのに Sarissa を使う事を考慮すべきです。注意:
document.implementation.createDocument()によって作成した DOM オブジェクトを操作するのに、Sarissa のクラスやメソッドを使用しないで下さい。機能しません。最初に DOM オブジェクトを作成するのには、必ず Sarissa を使わなければなりません。 - Parsing and Serializing XML at XUL Planet
カテゴリ: AJAX | DOM | Extensions