Parsing and serializing XML

by 2 contributors:

 

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, "") に置き換えて使用してください。xmlHttpRequestXMLHttpRequest のインスタンスです。

このコードはまずサーバーから取得した 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.responseXMLDocument のインスタンスです。

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);

ドキュメントのタグと貢献者

Contributors to this page: kmaglione, Shoot
最終更新者: kmaglione,