【PHP8.x】preserveWhiteSpaceプロパティの使い方

preserveWhiteSpaceプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

preserveWhiteSpaceプロパティは、PHPのDOMDocumentクラスに属し、XMLやHTMLドキュメントを読み込む際に、空白文字(スペース、タブ、改行など)をどのように扱うかを制御するプロパティです。

このプロパティのデフォルト値は通常trueに設定されています。これは、ドキュメントを解析する際に、全ての空白文字をテキストノードとしてDOMツリーに保持することを意味します。その結果、元のドキュメントのインデントや改行といった整形情報を含め、文字通りに構造が再現されます。

もしこのプロパティをfalseに設定した場合、DOMDocumentはドキュメントを読み込む際に、要素間に存在する意味を持たない空白文字を自動的に無視または削除します。例えば、XMLの要素を整形するために挿入されたインデントや改行などがこれに該当します。これにより、DOMツリーがより簡潔になり、メモリ使用量を削減できる場合があります。また、DOMツリーから特定の要素を探索する際に、意図しない空白文字のみを含むテキストノードに遭遇する可能性が減り、プログラムの処理が容易になる利点があります。

ただし、空白文字自体がコンテンツとして重要な意味を持つ場合(例えば、前後のスペースが不可欠なテキストデータや、プログラムコードを扱う場合など)には、falseに設定すると情報が失われる可能性があるため、注意が必要です。このプロパティは、load()loadXML()のようなドキュメントを読み込むメソッドを呼び出す前に設定する必要があります。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$dom->preserveWhiteSpace = false;
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

DOMDocument オブジェクトが、HTML や XML をパースする際に空白文字を保持するかどうかを示します。true の場合は空白文字が保持され、false の場合は無視されます。

サンプルコード

PHP DOMDocument preserveWhiteSpace の効果

1<?php
2
3/**
4 * DOMDocument の preserveWhiteSpace プロパティの動作を示します。
5 *
6 * preserveWhiteSpace は、XML ドキュメントをパースする際に、要素間の空白文字
7 * (スペース、タブ、改行)を DOM ツリーに含めるかどうかを制御するプロパティです。
8 * デフォルト値は true です。
9 *
10 * システムエンジニアを目指す初心者の方へ:
11 * XML データを扱う際、不要な空白文字がデータ処理に影響を与えたり、
12 * データサイズを増やしたりする場合があります。このプロパティを理解することで、
13 * よりクリーンな DOM ツリーを構築し、効率的にデータを扱えるようになります。
14 */
15function demonstrateDomPreserveWhiteSpace(): void
16{
17    // 意図的に多くの空白文字とインデントを含むXML文字列
18    $xmlString = <<<XML
19<root>
20    <item1>   Hello World   </item1>
21    <item2>
22        Another item with
23        multiline content
24    </item2>
25    <item3>
26        <subitem>
27            Nested content
28        </subitem>
29    </item3>
30</root>
31XML;
32
33    echo "--- preserveWhiteSpace が true (デフォルト) の場合 ---\n";
34    // 新しい DOMDocument オブジェクトを作成
35    $domTrue = new DOMDocument();
36    // preserveWhiteSpace のデフォルト値は true です。
37    // これにより、XML 内のすべての空白文字がテキストノードとして DOM ツリーに保持されます。
38    // 出力時に XML を整形しない (preserveWhiteSpace の効果を直接確認するため)
39    $domTrue->formatOutput = false;
40    $domTrue->loadXML($xmlString);
41    echo $domTrue->saveXML() . "\n\n";
42
43    echo "--- preserveWhiteSpace を false に設定した場合 ---\n";
44    // 新しい DOMDocument オブジェクトを作成
45    $domFalse = new DOMDocument();
46    // preserveWhiteSpace を false に設定すると、
47    // 要素間の意味のない空白文字(インデント、改行など)は DOM ツリーから削除されます。
48    $domFalse->preserveWhiteSpace = false;
49    // 出力時に XML を整形しない (preserveWhiteSpace の効果を直接確認するため)
50    $domFalse->formatOutput = false;
51    $domFalse->loadXML($xmlString);
52    echo $domFalse->saveXML() . "\n";
53}
54
55// 関数を実行して、preserveWhiteSpace の効果を確認
56demonstrateDomPreserveWhiteSpace();
57

DOMDocument::preserveWhiteSpaceプロパティは、PHPでXMLドキュメントをパースする際に、要素間の空白文字(スペース、タブ、改行など)をDOMツリーに含めるかどうかを制御する設定です。このプロパティはbool型の値を持ち、デフォルトではtrueが設定されています。

preserveWhiteSpacetrue(デフォルト値)の場合、XMLドキュメント内の整形のための空白文字やインデント、改行などもすべてテキストノードとしてDOMツリーに保持されます。これにより、元のXMLの構造が忠実に再現されます。

対して、preserveWhiteSpacefalseに設定すると、要素の開始タグと終了タグの間に存在する意味のない空白文字(インデントや改行など)は、DOMツリーに構築される際に自動的に削除されます。これにより、XMLデータから純粋な構造とコンテンツだけを抽出しやすくなり、余分な空白ノードによるデータ処理の複雑さを軽減できます。

このプロパティは引数を取らず、trueまたはfalseを設定するだけで、XMLパース時の空白文字の扱いを切り替えることができます。不要な空白文字がデータ処理に影響を与える可能性がある場合や、メモリ使用量を抑えたい場合に活用できます。

preserveWhiteSpaceプロパティは、XMLドキュメントを読み込む際に、要素間のインデントや改行などの空白文字をDOMツリーに含めるかを制御します。デフォルト値はtrueであり、これらの空白文字もテキストノードとしてDOMツリーに保持されます。

これをfalseに設定すると、要素間の意味のない空白文字はDOMツリーから削除され、よりコンパクトな構造になります。しかし、<data>Hello World</data>のように要素内の文字列に含まれる空白文字は、falseに設定しても削除されない点にご注意ください。これらはデータの一部と見なされます。

XMLの整形目的で入っている空白を無視したい場合にfalseは有効ですが、空白自体に意味があるXML(例: フォーマット済みテキスト)を扱う場合は、情報が失われないよう慎重に設定を検討する必要があります。この設定は、DOMツリーのノード数やメモリ使用量、その後のデータ処理の複雑さに影響を与える可能性があります。

PHP DOM preserveWhiteSpaceの動作確認

1<?php
2
3/**
4 * DOMDocument::preserveWhiteSpace プロパティの動作を実演します。
5 * preserveWhiteSpace が true (デフォルト) の場合と false の場合で、
6 * XMLの空白文字がDOMツリーにどのように影響するかを示します。
7 */
8function demonstratePreserveWhiteSpace(): void
9{
10    // サンプルXML文字列。要素間にインデントと改行が含まれます。
11    $xmlString = <<<XML
12<root>
13    <item>Value 1</item>
14    <item>
15        Value 2
16    </item>
17</root>
18XML;
19
20    // --- 1. preserveWhiteSpace が true (デフォルト) の場合 ---
21    echo "--- preserveWhiteSpace = true (デフォルト) ---" . PHP_EOL;
22    $domTrue = new DOMDocument();
23    // preserveWhiteSpace はデフォルトで true ですが、明示的に設定して分かりやすくします。
24    $domTrue->preserveWhiteSpace = true;
25    $domTrue->loadXML($xmlString);
26
27    // ルート要素の子ノード数を出力
28    // この場合、XMLのインデントや改行もテキストノードとしてカウントされます。
29    echo "ルート要素の子ノード数 (空白ノードも含む): " . $domTrue->documentElement->childNodes->length . PHP_EOL;
30
31    echo "ルート要素の子ノードの内容:" . PHP_EOL;
32    foreach ($domTrue->documentElement->childNodes as $node) {
33        if ($node->nodeType === XML_ELEMENT_NODE) {
34            echo "  [要素] <" . $node->nodeName . ">" . PHP_EOL;
35        } elseif ($node->nodeType === XML_TEXT_NODE) {
36            // 空白のみのテキストノードも保持されます
37            $content = trim($node->nodeValue);
38            if ($content === '') {
39                echo "  [空白ノード] (改行、スペースなど)" . PHP_EOL;
40            } else {
41                echo "  [テキストノード] '" . $content . "'" . PHP_EOL;
42            }
43        }
44    }
45    echo PHP_EOL;
46
47    // --- 2. preserveWhiteSpace が false の場合 ---
48    echo "--- preserveWhiteSpace = false ---" . PHP_EOL;
49    $domFalse = new DOMDocument();
50    $domFalse->preserveWhiteSpace = false; // 空白文字を保持しない設定
51    $domFalse->loadXML($xmlString);
52
53    // ルート要素の子ノード数を出力
54    // この場合、XMLのインデントや改行などの空白ノードはDOMツリーから削除され、
55    // 有効な要素ノードやテキストノードのみが残ります。
56    echo "ルート要素の子ノード数 (空白ノードは無視される): " . $domFalse->documentElement->childNodes->length . PHP_EOL;
57
58    echo "ルート要素の子ノードの内容:" . PHP_EOL;
59    foreach ($domFalse->documentElement->childNodes as $node) {
60        if ($node->nodeType === XML_ELEMENT_NODE) {
61            echo "  [要素] <" . $node->nodeName . ">" . PHP_EOL;
62        } elseif ($node->nodeType === XML_TEXT_NODE) {
63            // 有効なテキストノードのみが残ります
64            $content = trim($node->nodeValue);
65            if ($content !== '') {
66                echo "  [テキストノード] '" . $content . "'" . PHP_EOL;
67            }
68        }
69    }
70}
71
72// 関数を実行して、DOMDocument::preserveWhiteSpace の動作を確認します。
73demonstratePreserveWhiteSpace();

DOMDocument::preserveWhiteSpaceは、PHPのDOMDocumentクラスがXMLドキュメントを解析する際、要素間の空白文字(改行、スペースなど)をDOMツリーに保持するかどうかを制御するbool型のプロパティです。

デフォルト値はtrueで、この場合、XMLに含まれるインデントや改行もテキストノードとして保持されます。そのため、childNodes->lengthなどで子ノードを数える際には、これらの空白ノードも含まれることになります。

preserveWhiteSpacefalseを設定すると、XML中の意味のない空白文字はDOMツリーから自動的に除去されます。これにより、DOMツリーには要素ノードや実質的なテキストノードのみが残り、余分な空白ノードが含まれないため、ノードの探索がよりシンプルになります。

XMLの整形情報を保持したい場合はtrueを、データの実質的な内容のみを効率的に処理したい場合はfalseを選択するなど、用途に応じてこの設定を使い分け、XML処理の挙動を調整できます。

DOMDocument::preserveWhiteSpaceプロパティは、XMLのインデントや改行などの構造的な空白文字をDOMツリーに含めるかどうかを制御します。このプロパティのデフォルト値はtrueであるため、明示的に設定しないとこれらの空白がテキストノードとして扱われ、子ノードの数が予期せず増えたり、要素の走査時に意図しない空白ノードに遭遇したりする可能性があります。

システムエンジニアがXMLのデータ構造のみを操作する際は、通常、空白ノードが不要なケースが多いため、このプロパティを明示的にfalseに設定することをお勧めします。これにより、実質的なXML要素や意味のあるテキストノードのみに焦点を当てて、よりシンプルかつ安全にDOMツリーを扱えます。ただし、XMLの書式自体が重要な意味を持つ場合や、整形された出力が必要な場合は、trueのままにしておく必要があります。

関連コンテンツ

関連プログラミング言語