XML の構文解析とシリアライズ
場合によっては、XML のコンテンツを解析して DOM ツリーに変換する必要があるでしょう。または逆に、既存の DOM ツリーを XML にシリアライズすることもあります。この記事では、XML のシリアライズと解析の一般的な作業を容易にするため、ウェブプラットフォームで提供されるオブジェクトに注目します。
XMLSerializer
-
DOM ツリーをシリアライズし、XML を含む文字列に変換します。
DOMParser
-
XML を含む文字列を解析して DOM ツリーを構築し、入力データに基づいて適切な
XMLDocument
またはDocument
を返します。 fetch()
-
URL からコンテンツを読み込みます。 XML コンテンツは、
DOMParser
を使用して構文解析できるテキスト文字列として返されます。 XMLHttpRequest
-
fetch()
の前身です。fetch()
API とは異なり、XMLHttpRequest
は、そのプロパティresponseXML
を使用して、リソースをDocument
として返すことができます。 - XPath
-
XML 文書の特定の部分のアドレスを含む文字列を作成し、それらのアドレスに基づいて XML ノードを特定する技術。
XML 文書を作成する
次のいずれかの方法で XML 文書を作成します(これは Document
のインスタンスです)。
文字列を DOM ツリーに構文解析する
この例では、DOMParser
を使用して文字列の XML の断片を DOM ツリーに変換します。
const xmlStr = '<q id="a"><span id="b">hey!</span></q>';
const parser = new DOMParser();
const doc = parser.parseFromString(xmlStr, "application/xml");
// ルート要素の名前またはエラーメッセージを出力します
const errorNode = doc.querySelector("parsererror");
if (errorNode) {
console.log("構文解析中にエラー発生");
} else {
console.log(doc.documentElement.nodeName);
}
URL でアドレス指定が可能なリソースを DOM ツリーに構文解析する
fetch の使用
URL アドレス指定が可能な XML ファイルを読み込み解析して DOM ツリーにするサンプルコードを次に示します。
fetch("example.xml")
.then((response) => response.text())
.then((text) => {
const parser = new DOMParser();
const doc = parser.parseFromString(text, "text/xml");
console.log(doc.documentElement.nodeName);
});
このコードはリソースをテキスト文字列として取得し、 DOMParser.parseFromString()
を使用して XMLDocument
を構築します。
文書が HTML である場合、上記のコードは Document
を返します。文書が XML である場合、返されるオブジェクトは XMLDocument
になります。この 2 種類は基本的に同じですが、その違いは主に歴史的な部分であり、差別化にはいくつかの実用的な利点があります。
メモ: HTMLDocument
インターフェイスもありますが、独立した型であるとは限りません。独立した型として扱うブラウザーもありますが、単なる Document
インターフェイスへのエイリアスとしているブラウザーもあります。
XML 文書のシリアライズ
Document
がある時、XMLSerializer.serializeToString()
メソッドを用いて文章の DOM ツリーを XML にシリアライズし直すことができます。
前の節で作成した XML 文書をシリアライズするには、以下の方法を用いてください。
DOM ツリーを文字列にシリアライズ
まず、DOM ツリーの作成方法で説明された方法で DOM ツリーを作成します。もしくは、 fetch()
で取得した DOM ツリーを用います。
DOM ツリー doc
を XML 文字列にシリアライズするには、以下のように XMLSerializer.serializeToString()
を呼び出します。
const serializer = new XMLSerializer();
const xmlStr = serializer.serializeToString(doc);
HTML 文書のシリアライズ
DOM が HTML 文書である場合、serializeToString()
を用いてシリアライズすることもできますが、より単純な方法があります。Element.innerHTML
プロパティ (指定したノードの子孫のみを得たい場合) または Element.outerHTML
プロパティ (指定したノードとその子孫を得たい場合) を用いればよいです。
const docInnerHtml = document.documentElement.innerHTML;
これを実行すると、 docHTML
は文書の内容、すなわち <body>
要素の内容を表す HTML が入った文字列になります。
このコードを用いると、 <body>
とその子孫に対応する HTML を得ることができます。
const docOuterHtml = document.documentElement.outerHTML;