【PHP8.x】DOMDocument::saveXML()メソッドの使い方
saveXMLメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
saveXMLメソッドは、DOMDocumentオブジェクトが内部的に保持しているXMLツリー構造を、文字列形式に変換して出力するメソッドです。このメソッドを引数なしで呼び出すと、XML宣言を含むドキュメント全体が、整形されたXML文字列として返されます。特定の要素だけをXML文字列として取得したい場合は、第1引数に対象となるDOMNodeオブジェクトを指定します。これにより、指定したノードとそのすべての子孫ノードを含む部分的なXML文字列を生成することが可能です。また、第2引数にはオプションのフラグを指定でき、例えば空要素の表現方法など、出力形式を細かく制御できます。メソッドの実行が成功した場合は生成されたXML文字列を、失敗した場合は false を返します。このメソッドは、プログラム上で動的に生成または変更したXMLデータを、ファイルへ保存したり、APIのレスポンスとして送信したりする際の基本的な操作として利用されます。
構文(syntax)
1<?php 2// DOMDocumentオブジェクトを作成します 3$doc = new DOMDocument('1.0', 'UTF-8'); 4 5// 出力するXMLを整形するオプションを有効にします 6$doc->formatOutput = true; 7 8// 要素を作成します 9$root = $doc->createElement('book'); 10$title = $doc->createElement('title', 'はじめてのPHP'); 11$author = $doc->createElement('author', '山田太郎'); 12 13// 要素を親子関係になるように組み立てます 14$root->appendChild($title); 15$root->appendChild($author); 16$doc->appendChild($root); 17 18// ドキュメント全体をXML形式の文字列として取得します 19// saveXML(?DOMNode $node = null, int $options = 0): string|false 20$xmlString = $doc->saveXML(); 21 22// 結果を出力します 23echo $xmlString; 24 25// 特定のノード(<title>要素)のみをXML文字列として取得します 26$titleNodeString = $doc->saveXML($title); 27 28// 結果を出力します 29echo $titleNodeString;
引数(parameters)
?DOMNode $node = null, int $options = 0
- DOMNode | null $node: 保存するDOMNodeを指定します。省略した場合、DOMDocument全体が保存されます。
- int $options = 0: 保存時のオプションを指定します。
戻り値(return)
string|false
XMLドキュメント全体を文字列として返します。処理に失敗した場合はfalseを返します。
サンプルコード
PHP DOMDocument::saveXMLでXMLを整形する
1<?php 2 3/** 4 * DOMDocument::saveXML メソッドを使用してXMLを整形して出力するサンプル。 5 * 6 * DOMDocumentのformatOutputプロパティをtrueに設定することで、 7 * saveXMLメソッドの出力が読みやすい形式に整形されます。 8 * システムエンジニアを目指す初心者の方にも理解しやすいよう、基本的なXML操作を示します。 9 */ 10function exampleSaveXmlPretty(): void 11{ 12 // 整形されていないシンプルなXML文字列を用意します。 13 $xmlString = '<root><item id="1">First Item</item><item id="2">Second Item</item></root>'; 14 15 // DOMDocumentクラスの新しいインスタンスを作成します。 16 // '1.0'はXMLのバージョン、'UTF-8'はエンコーディングを指定します。 17 $dom = new DOMDocument('1.0', 'UTF-8'); 18 19 // XML文字列をDOMDocumentにロードします。 20 // ロードに失敗した場合(例: 不正なXML)、falseを返します。 21 // LIBXML_NOERROR はXMLパース時のエラーを抑制します(開発時はエラー表示を推奨)。 22 if (!$dom->loadXML($xmlString, LIBXML_NOERROR)) { 23 echo "エラー: XMLのロードに失敗しました。不正なXMLの可能性があります。\n"; 24 return; 25 } 26 27 // formatOutputプロパティをtrueに設定することで、 28 // saveXMLメソッドがXMLを視覚的に整形(インデントなどを追加)して出力するようになります。 29 $dom->formatOutput = true; 30 31 // saveXMLメソッドを呼び出して、DOMDocumentの内容をXML文字列として取得します。 32 // 第1引数をnullにすると、ドキュメント全体がXMLとして出力されます。 33 // 成功した場合はXML文字列、失敗した場合はfalseを返します。 34 $prettyXml = $dom->saveXML(); 35 36 // saveXMLの戻り値をチェックし、成功した場合のみ出力します。 37 if ($prettyXml !== false) { 38 echo "整形されたXML:\n"; 39 echo $prettyXml; 40 } else { 41 echo "エラー: XMLの保存(saveXML)に失敗しました。\n"; 42 } 43} 44 45// サンプル関数を実行して結果を表示します。 46exampleSaveXmlPretty(); 47 48?>
このサンプルコードは、PHPのDOMDocument::saveXMLメソッドを利用して、XMLデータを整形して出力する方法を示しています。まず、整形されていないシンプルなXML文字列を用意し、XMLドキュメントをオブジェクトとして扱うDOMDocumentクラスの新しいインスタンスを作成します。
次に、用意したXML文字列をDOMDocumentオブジェクトにloadXMLメソッドで読み込みます。このステップでは、XMLの構造が正しいかどうかの確認も行われます。
XMLを視覚的に整形して出力するためには、DOMDocumentオブジェクトのformatOutputプロパティをtrueに設定することが重要です。この設定により、saveXMLメソッドの出力時に自動的にインデントや改行が追加され、人間にとって読みやすい形式に整形されます。
最後に、saveXMLメソッドを呼び出してDOMDocumentオブジェクトの内容をXML文字列として取得します。このメソッドの第1引数をnullにすると、ドキュメント全体のXMLが出力されます。もし特定のXMLノードだけを出力したい場合は、そのノードを引数として渡すことができます。saveXMLメソッドは、処理が成功した場合は整形されたXML文字列を返し、失敗した場合はfalseを返します。そのため、戻り値を適切にチェックしてエラーに対応することが、安定したシステム開発において非常に大切です。これにより、整形されたXMLがコンソールに表示されます。
DOMDocument::saveXMLメソッドでXMLを整形するには、「formatOutput」プロパティを「true」に設定することが必須です。これを忘れると、整形されずに一行で出力されます。「saveXML」はXMLの出力に失敗すると「false」を返すため、必ずその戻り値をチェックし、エラー処理を行うことが重要ですし、安全なコードの基本となります。サンプルでは第1引数を「null」としてドキュメント全体を出力していますが、特定のDOMNodeだけをXMLとして出力したい場合は、そのノードを第1引数に指定できます。また、XMLを読み込むloadXMLメソッドでは、開発段階ではLIBXML_NOERRORのようなエラー抑制は避け、XML構文のエラーを正確に把握することをお勧めします。
PHP DOMDocument::saveXMLでUTF-8形式XMLを取得する
1<?php 2 3/** 4 * DOMDocument::saveXML メソッドの使用例。 5 * XMLドキュメントを作成し、その内容をUTF-8エンコーディングの文字列として出力します。 6 * システムエンジニアを目指す初心者向けに、簡潔さと正確さを重視しています。 7 */ 8function demonstrateDomSaveXmlWithUtf8(): void 9{ 10 // 1. DOMDocument オブジェクトの初期化 11 // '1.0' はXMLのバージョン、'UTF-8' はXMLドキュメントのエンコーディングを指定します。 12 // saveXML メソッドは、この指定されたエンコーディングで文字列を出力します。 13 $dom = new DOMDocument('1.0', 'UTF-8'); 14 15 // 2. XMLの可読性を高めるための設定(オプション) 16 // formatOutput を true に設定すると、生成されるXMLにインデントと改行が追加され、見やすくなります。 17 $dom->formatOutput = true; 18 19 // 3. ルート要素の作成と追加 20 $rootElement = $dom->createElement('data'); 21 $dom->appendChild($rootElement); 22 23 // 4. 子要素の作成と追加(日本語を含むことでUTF-8処理を確認) 24 $item1 = $dom->createElement('item', 'これは日本語のテキストです。'); 25 $rootElement->appendChild($item1); 26 27 $item2 = $dom->createElement('item', 'Hello, world! 😊'); // 絵文字もUTF-8で正しく扱われます 28 $rootElement->appendChild($item2); 29 30 // 5. DOMDocument の内容をXML文字列として保存 (saveXML) 31 // saveXML() は、現在のDOMDocumentの内容全体をXML形式の文字列として返します。 32 // 引数を指定しない場合、ドキュメント全体が対象となります。 33 // 戻り値は成功時に string、失敗時に false です。 34 $xmlString = $dom->saveXML(); 35 36 // 6. 結果の出力 37 if ($xmlString !== false) { 38 echo "--- 生成されたXMLドキュメント (UTF-8) ---\n"; 39 echo $xmlString; 40 echo "------------------------------------------\n"; 41 } else { 42 echo "XML文字列の生成に失敗しました。\n"; 43 } 44} 45 46// 関数を実行してサンプルコードの動作を確認します。 47demonstrateDomSaveXmlWithUtf8(); 48
PHPのDOMDocument::saveXMLメソッドは、作成したXMLドキュメントの内容を文字列として取得するために使用されます。システムエンジニアがプログラム内でXMLデータを扱ったり、外部にXML形式で出力したりする際に重要な機能です。
このメソッドを利用するには、まずnew DOMDocument('1.0', 'UTF-8')のようにXMLのバージョンとエンコーディングを指定してDOMDocumentオブジェクトを初期化します。ここで指定する「UTF-8」は、saveXMLが最終的に出力するXML文字列のエンコーディングとなります。サンプルコードのようにformatOutputをtrueに設定すると、生成されるXMLにインデントと改行が加わり、人間にとって読みやすい形式になります。
XMLドキュメントの構造は、createElementメソッドで要素を作成し、appendChildメソッドでそれらを階層的に追加していくことで構築します。この際、日本語や絵文字などのマルチバイト文字も、初期化時にUTF-8エンコーディングが正しく指定されていれば、問題なくXML文字列として扱われます。
XML構造の構築が完了したら、$dom->saveXML()を呼び出すことで、現在のDOMDocumentオブジェクトの内容全体がXML形式の文字列として返されます。オプションとして、引数に特定のDOMNodeオブジェクトを渡すと、そのノード以下のXMLのみを文字列化することも可能です。戻り値は、処理が成功した場合にはXML文字列(string)、失敗した場合にはfalseとなりますので、常に結果をチェックすることが推奨されます。
DOMDocument::saveXMLメソッドは、コンストラクタで指定したエンコーディング(例:UTF-8)に基づきXML文字列を出力します。日本語や特殊文字を正しく扱うには、UTF-8の指定が不可欠です。このメソッドは成功時にXML文字列を、失敗時にfalseを返しますので、必ず戻り値がfalseでないかを確認し、適切にエラー処理を行ってください。引数なしの場合、ドキュメント全体が出力されますが、特定のDOMNodeを引数に渡すことで、その要素のみをXMLとして取得可能です。formatOutput = trueの設定はXMLの可読性を高めますが、厳密なXML比較や処理時には余計な空白や改行に注意が必要です。