【PHP8.x】saveXmlメソッドの使い方

saveXmlメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

saveXmlメソッドは、Dom\XMLDocumentクラスに属するメソッドで、XMLドキュメントを文字列として保存する機能を提供します。具体的には、メモリ上に構築されたXMLドキュメントを、XML形式の文字列に変換し、その文字列を返します。このメソッドを使用することで、XMLドキュメントの内容をファイルに書き込んだり、ネットワーク経由で送信したりすることが容易になります。

saveXmlメソッドは、オプションで引数を指定することができます。この引数を利用することで、XMLドキュメントのフォーマットを制御することが可能です。例えば、整形されたXML(人間が読みやすいようにインデントや改行が含まれたXML)として出力するか、最小限のスペースで出力するかなどを指定できます。引数を省略した場合、デフォルトの設定でXMLドキュメントが文字列化されます。

このメソッドは、XMLドキュメントの構造を保持したまま文字列として取得したい場合に非常に便利です。特に、XMLデータをデータベースに格納したり、他のシステムとの連携に利用したりする際に、saveXmlメソッドは重要な役割を果たします。また、XMLデータのデバッグや検証を行う際にも、文字列としてXMLドキュメントの内容を確認できるため、開発効率の向上に貢献します。

システムエンジニアは、saveXmlメソッドを適切に使用することで、XMLデータを効率的に処理し、様々なシステム間のデータ連携を円滑に進めることができます。XMLに関する知識と合わせて、saveXmlメソッドの機能を理解しておくことは、システム開発において不可欠なスキルと言えるでしょう。

構文(syntax)

1<?php
2$dom = new DomDocument('1.0', 'UTF-8');
3// XMLドキュメントを構築する処理
4$dom->appendChild($dom->createElement('root'));
5$xmlString = $dom->saveXML();
6echo $xmlString;
7?>

引数(parameters)

?Dom\Node $node = null, int $options = 0

  • ?Dom\Node $node = null: 保存するDOMノードを指定します。nullの場合はドキュメント全体が保存されます。
  • int $options = 0: 保存時のオプションを指定する整数です。

戻り値(return)

string|false

XMLドキュメントの内容をXML文字列として返します。失敗した場合はfalseを返します。

サンプルコード

PHP Dom\XMLDocument でXMLを整形する

1<?php
2
3use Dom\XMLDocument;
4
5/**
6 * Dom\XMLDocument を使用してXMLを生成し、整形(pretty print)して出力します。
7 *
8 * Dom\XMLDocument 自体にはXMLを直接整形する機能がないため、
9 * 一度 XML文字列として出力した後、DOMDocument クラスを一時的に利用して
10 * 整形処理(インデントと改行の追加)を行います。
11 *
12 * @return string 整形されたXML文字列
13 */
14function generatePrettyXmlExample(): string
15{
16    // 1. Dom\XMLDocument のインスタンスを作成し、XML構造を構築
17    // バージョンとエンコーディングを指定します。
18    $document = new XMLDocument('1.0', 'UTF-8');
19
20    // ルート要素 'root' を作成し、ドキュメントに追加します。
21    $rootElement = $document->createElement('root');
22    $document->appendChild($rootElement);
23
24    // 子要素 'item' を作成し、属性とテキストノードを追加します。
25    $itemElement1 = $document->createElement('item');
26    $itemElement1->setAttribute('id', '1');
27    $itemElement1->appendChild($document->createTextNode('Hello, Dom!'));
28    $rootElement->appendChild($itemElement1);
29
30    // 別の 'item' 要素も追加します。
31    $itemElement2 = $document->createElement('item');
32    $itemElement2->setAttribute('id', '2');
33    $itemElement2->appendChild($document->createTextNode('PHP 8 Rocks!'));
34    $rootElement->appendChild($itemElement2);
35
36    // 2. Dom\XMLDocument の saveXml メソッドでXML文字列を取得
37    // 第一引数を null にすることでドキュメント全体を、第二引数を 0 にすることでデフォルトオプションで保存します。
38    // この時点では、Dom\XMLDocument に直接的な整形機能がないため、XMLは一行で出力されます。
39    $unformattedXml = $document->saveXml(null, 0);
40
41    // 3. 取得したXML文字列を DOMDocument にロードし、整形設定を行う
42    // DOMDocument はPHP標準のDOM操作クラスで、XML整形機能を持っています。
43    $domDocument = new DOMDocument('1.0', 'UTF-8');
44    // formatOutput を true に設定することで、XMLが整形されて出力されます。
45    $domDocument->formatOutput = true;
46    // Dom\XMLDocument から得た整形されていないXML文字列を DOMDocument にロードします。
47    $domDocument->loadXML($unformattedXml);
48
49    // 4. DOMDocument の saveXML メソッドで整形されたXML文字列を返します。
50    return $domDocument->saveXML();
51}
52
53// 関数を実行し、整形されたXML文字列を標準出力します。
54echo generatePrettyXmlExample();

Dom\XMLDocumentクラスのsaveXmlメソッドは、構築したXMLツリーをXML文字列として出力するために使用されます。第一引数$nodeに特定のノードを指定するとそのノード以下を、nullの場合はドキュメント全体を文字列化します。第二引数$optionsは追加の保存オプションを指定できますが、通常は0でデフォルト動作となります。このメソッドは成功するとXML文字列を返し、失敗するとfalseを返します。

このsaveXmlメソッド自体には、XMLを読みやすく整形(pretty print)する機能は直接ありません。そのため、サンプルコードでは、一度saveXmlで整形されていないXML文字列を取得した後、PHP標準のDOMDocumentクラスを補助的に利用して整形処理を行っています。

サンプルコードでは、まずDom\XMLDocumentでXMLの構造を作成します。その後、saveXml(null, 0)を呼び出して、作成したドキュメント全体のXMLを整形されていない状態で取得しています。取得したXML文字列は、DOMDocumentクラスのインスタンスにloadXMLメソッドで読み込まれます。DOMDocumentformatOutputプロパティをtrueに設定することで、出力時にインデントと改行が追加され、XMLが視覚的に整形されます。最後に、DOMDocumentsaveXMLメソッドを通じて、整形された最終的なXML文字列が返されます。

このサンプルコードで利用しているDom\XMLDocument::saveXmlメソッドは、XMLデータを文字列として出力しますが、XMLの整形(インデントや改行の追加)は直接行いません。整形されたXMLが必要な場合は、一度saveXmlで取得したXML文字列を、PHP標準のDOMDocumentクラスに読み込み直す必要があります。DOMDocumentformatOutputプロパティをtrueに設定することで、整形されたXMLを生成できます。Dom\XMLDocumentDOMDocumentは異なるクラスですので、それぞれの特性を理解して使い分けることが重要です。また、saveXmlメソッドは処理に失敗した場合にfalseを返す可能性があるため、実運用では戻り値の確認とエラーハンドリングを検討してください。

PHP Dom saveXml UTF-8でXMLを保存する

1<?php
2
3/**
4 * Dom\XMLDocument::saveXml メソッドの使用例を示します。
5 *
6 * この関数は、新しい XML ドキュメントを作成し、要素とテキストを追加した後、
7 * ドキュメント全体を UTF-8 エンコーディングの XML 文字列として保存します。
8 * システムエンジニアを目指す初心者でも理解しやすいように、基本的な手順で構成されています。
9 */
10function demonstrateSaveXml(): void
11{
12    // 1. 新しい XML ドキュメントを作成します。
13    // '1.0' は XML のバージョン、'UTF-8' はドキュメントのエンコーディングを指定します。
14    // saveXml() はこの指定されたエンコーディングで出力します。
15    $document = new Dom\XMLDocument('1.0', 'UTF-8');
16
17    // 2. ルート要素 'document' を作成し、ドキュメントに追加します。
18    $rootElement = $document->createElement('document');
19    $document->appendChild($rootElement);
20
21    // 3. 子要素 'data' を作成し、ルート要素に追加します。
22    $dataElement = $document->createElement('data');
23    $rootElement->appendChild($dataElement);
24
25    // 4. 子要素 'item' を作成し、'data' 要素に追加します。
26    $itemElement = $document->createElement('item');
27    $dataElement->appendChild($itemElement);
28
29    // 5. 'item' 要素にテキストノードを追加します。
30    // 日本語を含めることで、UTF-8 エンコーディングが正しく処理されていることを確認できます。
31    $textNode = $document->createTextNode('PHP の Dom\XMLDocument.saveXml のサンプルです。');
32    $itemElement->appendChild($textNode);
33
34    // 6. ドキュメント全体を XML 文字列として保存します。
35    // saveXml() メソッドは、ドキュメントの内容を XML 形式の文字列として返します。
36    // ドキュメント作成時に指定した UTF-8 エンコーディングが適用されます。
37    $xmlString = $document->saveXml();
38
39    // 7. saveXml() が失敗した場合は false を返します。
40    if ($xmlString === false) {
41        echo "エラー: XML ドキュメントの保存に失敗しました。\n";
42        return;
43    }
44
45    // 8. 生成された XML 文字列を出力します。
46    echo "生成された XML (UTF-8):\n";
47    echo $xmlString;
48    echo "\n";
49
50    // オプション: 特定のノードのみを保存する例
51    // 例えば 'item' 要素とその子孫だけを保存したい場合:
52    // $itemXmlString = $document->saveXml($itemElement);
53    // if ($itemXmlString !== false) {
54    //     echo "\n'item' 要素のみの XML:\n";
55    //     echo $itemXmlString;
56    // }
57}
58
59// 関数を実行してサンプルコードの動作を確認します。
60demonstrateSaveXml();

PHP 8のDom\XMLDocument::saveXmlメソッドは、構築したXMLドキュメントやその一部をXML形式の文字列として取得する際に利用されます。このサンプルコードでは、まず新しいXMLドキュメントをUTF-8エンコーディングで作成し、ルート要素や子要素、日本語を含むテキストノードを追加してXML構造を組み立てています。引数なしでsaveXmlメソッドを呼び出すと、構築されたドキュメント全体がXML文字列として返され、ドキュメント作成時に指定したUTF-8エンコーディングが適用されるため、日本語も正しく扱われます。

引数として特定のDom\Nodeオブジェクトを指定することも可能で、その場合はドキュメント全体ではなく、指定したノードとすべての子孫のみがXML文字列として保存されます。これにより、XMLドキュメントの中から必要な部分だけを柔軟に抽出できます。メソッドの戻り値は、XML文字列が正常に生成された場合はstring型で返されますが、何らかの理由で保存に失敗した場合はfalseが返されるため、エラーハンドリングを行うことが推奨されます。この機能は、プログラム内でXMLデータを操作し、その結果を文字列として利用する場面で非常に有効です。

Dom\XMLDocument::saveXmlメソッドは、ドキュメント生成時に指定したエンコーディング(例:UTF-8)でXML文字列を出力します。日本語などのマルチバイト文字を扱う際は、エンコーディングの指定と確認が特に重要です。誤った指定は文字化けの原因となるためご注意ください。

このメソッドは成功時にXML文字列を、失敗時にはfalseを返します。必ず戻り値をチェックし、falseの場合は適切にエラー処理を行うことで、堅牢なプログラムになります。

引数に特定のDom\Nodeオブジェクトを渡すと、そのノードとその子孫要素のみをXMLとして保存できます。ドキュメント全体ではなく、部分的なXMLを生成したい場合に活用してください。オプション引数もありますが、まずはデフォルトでの使用から慣れていきましょう。