Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】XMLReader::WHITESPACE定数の使い方

WHITESPACE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

XMLReader::WHITESPACE定数は、PHPのXMLReaderクラスにおいて、XMLドキュメント内の空白文字ノードのタイプを表す定数です。XMLReaderは、XMLファイルを効率的にストリーム形式で読み込み、XMLドキュメントを構成するさまざまな要素(タグ、テキスト、属性など)を「ノード」という単位で扱います。この定数は、XMLReaderが現在位置しているノードが、要素と要素の間や、テキストデータに含まれない単なるスペース、タブ、改行などの空白文字であることを識別するために使用されます。

システムエンジニアを目指す初心者の方々にとって、XMLファイルを処理する際、文書の可読性を高めるために挿入された空白文字は、多くの場合、実際のデータ抽出やビジネスロジックには不要な情報となることがあります。XMLReader::WHITESPACE定数を利用することで、XMLReader::nodeTypeプロパティがこの定数の値と一致するかどうかをチェックし、意味のない空白ノードを効率的にスキップして、必要なデータが含まれるノードだけに処理を集中させることが可能になります。これにより、XMLデータから意図した情報のみを正確に抽出し、より堅牢で効率的なXMLパース処理を実装する手助けとなります。

構文(syntax)

1<?php
2$reader = new XMLReader();
3$reader->xml('<a>  <b>example</b>  </a>');
4while ($reader->read()) {
5    if ($reader->nodeType === XMLReader::WHITESPACE) {
6        // XMLReader::WHITESPACE 定数を使用して、現在のノードが空白(whitespace)であるかを判定します。
7    }
8}
9?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP XMLReader空白文字の扱い

1<?php
2
3/**
4 * XMLReader::WHITESPACE 定数を使用して、XML内の空白文字ノードの扱いを比較する関数。
5 *
6 * この関数は、システムエンジニアを目指す初心者向けに、XMLReaderがXMLドキュメント内の
7 * 改行、スペース、タブなどの空白文字(whitespace)をどのように認識するかを
8 * 具体的なコード例で示します。
9 *
10 * XMLReader::WHITESPACE は、XMLReader::setParserProperty() メソッドと組み合わせて使用され、
11 * パーサーがこれらの空白文字をノードとして報告するかどうかを制御します。
12 */
13function demonstrateXmlReaderWhitespaceHandling(): void
14{
15    // サンプルXMLデータ。要素間に改行やインデント(空白文字)が含まれています。
16    $xmlContent = <<<XML
17<root>
18    <item>Value A</item>
19    <item>Value B</item>
20</root>
21XML;
22
23    echo "--- XMLReader::WHITESPACE を 'true' に設定した場合 (デフォルトの挙動) ---\n";
24    echo "空白文字も個別のノードとして報告されます。\n";
25
26    // 新しいXMLReaderインスタンスを作成します。
27    $readerWithWhitespace = new XMLReader();
28    // 読み込むXML文字列を設定します。
29    $readerWithWhitespace->xml($xmlContent);
30    // XMLReader::WHITESPACE プロパティを true に設定します。
31    // これはデフォルトの挙動なので、明示的に設定しなくても結果は同じですが、
32    // 理解を深めるためにここで設定します。
33    $readerWithWhitespace->setParserProperty(XMLReader::WHITESPACE, true);
34
35    // XMLドキュメントをノードごとに読み進めます。
36    while ($readerWithWhitespace->read()) {
37        // ノードタイプが XMLReader::WHITESPACE (7) または XMLReader::SIGNIFICANT_WHITESPACE (8) の場合、
38        // それが空白ノードであることを示します。
39        // ノードタイプの一覧はPHPマニュアルのXMLReaderクラス定数にあります。
40        echo sprintf(
41            "ノードタイプ: %d (%s), ノード名: '%s', ノード値: '%s'\n",
42            $readerWithWhitespace->nodeType,
43            getXmlReaderNodeTypeString($readerWithWhitespace->nodeType),
44            $readerWithWhitespace->name,
45            // ノード値は前後の空白をトリムして表示し、見やすくします。
46            trim($readerWithWhitespace->value)
47        );
48    }
49    // リーダーを閉じ、リソースを解放します。
50    $readerWithWhitespace->close();
51
52    echo "\n--- XMLReader::WHITESPACE を 'false' に設定した場合 ---\n";
53    echo "空白文字ノードはスキップされ、報告されません。\n";
54
55    // 別のXMLReaderインスタンスを作成し、同様にXMLを設定します。
56    $readerWithoutWhitespace = new XMLReader();
57    $readerWithoutWhitespace->xml($xmlContent);
58    // XMLReader::WHITESPACE プロパティを false に設定し、空白ノードを無視させます。
59    $readerWithoutWhitespace->setParserProperty(XMLReader::WHITESPACE, false);
60
61    while ($readerWithoutWhitespace->read()) {
62        echo sprintf(
63            "ノードタイプ: %d (%s), ノード名: '%s', ノード値: '%s'\n",
64            $readerWithoutWhitespace->nodeType,
65            getXmlReaderNodeTypeString($readerWithoutWhitespace->nodeType),
66            $readerWithoutWhitespace->name,
67            trim($readerWithoutWhitespace->value)
68        );
69    }
70    $readerWithoutWhitespace->close();
71}
72
73/**
74 * XMLReaderのノードタイプ整数値を、可読性のある文字列に変換するヘルパー関数。
75 *
76 * @param int $nodeType XMLReader::nodeType プロパティで返される整数値
77 * @return string ノードタイプを表す文字列
78 */
79function getXmlReaderNodeTypeString(int $nodeType): string
80{
81    return match ($nodeType) {
82        XMLReader::NONE => 'NONE',
83        XMLReader::ELEMENT => 'ELEMENT',
84        XMLReader::ATTRIBUTE => 'ATTRIBUTE',
85        XMLReader::TEXT => 'TEXT',
86        XMLReader::CDATA => 'CDATA',
87        XMLReader::ENTITY_REF => 'ENTITY_REF',
88        XMLReader::ENTITY => 'ENTITY',
89        XMLReader::PI => 'PI', // Processing Instruction
90        XMLReader::COMMENT => 'COMMENT',
91        XMLReader::DOCUMENT => 'DOCUMENT',
92        XMLReader::DOCUMENT_TYPE => 'DOCUMENT_TYPE',
93        XMLReader::DOCUMENT_FRAGMENT => 'DOCUMENT_FRAGMENT',
94        XMLReader::NOTATION => 'NOTATION',
95        XMLReader::WHITESPACE => 'WHITESPACE',
96        XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE',
97        XMLReader::END_ELEMENT => 'END_ELEMENT',
98        XMLReader::END_ENTITY => 'END_ENTITY',
99        XMLReader::XML_DECLARATION => 'XML_DECLARATION',
100        default => 'UNKNOWN',
101    };
102}
103
104// 上記の関数を実行して、XMLReaderの挙動を確認します。
105demonstrateXmlReaderWhitespaceHandling();

PHP 8のXMLReader::WHITESPACEは、XMLReaderクラスに所属する定数です。この定数は、XMLドキュメントを解析する際に、改行、スペース、タブといった「空白文字(whitespace)」をどのように扱うかを制御するために使用されます。

具体的には、XMLReader::setParserProperty()メソッドの第一引数としてこの定数を指定し、第二引数にtrueまたはfalseを設定することで挙動を切り替えます。この定数自体に引数はなく、特定の戻り値もありません。

XMLReader::WHITESPACEtrueに設定した場合(これがデフォルトの挙動です)、XMLReaderはXMLドキュメント内のすべての空白文字を個別のノードとして報告します。これにより、XMLファイルのレイアウト情報まで詳細に解析することができます。

一方、XMLReader::WHITESPACEfalseに設定すると、XMLReaderは要素間にある空白文字ノードをスキップし、報告しません。これにより、実際のデータや構造を持つノードのみに焦点を当てた解析が可能となり、不要な空白ノードの処理を省くことで、コードがシンプルになり、パフォーマンスが向上する場合があります。システムエンジニアを目指す方にとって、解析したいXMLデータの特性に合わせてこの設定を適切に選択することは、効率的なXML処理を実現する上で重要です。

XMLReader::WHITESPACE 定数は、XML内の改行やスペースなどの空白文字をXMLの要素とは別のノードとして扱うかを制御します。デフォルトでは空白文字も個別のノードとして読み込まれるため、空白文字を処理に含めるか、スキップするかを意識することが重要です。XMLの構造データのみに着目し、不要な空白ノードを無視したい場合は、setParserProperty(XMLReader::WHITESPACE, false) を設定してください。これにより、パーサーは空白ノードをスキップし、より効率的にXMLを解析できるようになります。大量のXMLデータを扱う際にパフォーマンス向上に繋がることがありますので、用途に応じて適切に設定してください。また、利用後は必ず close() メソッドでリソースを解放するのを忘れないようにしましょう。

PHP XMLReader WHITESPACE 定数で空白ノードを検出する

1<?php
2
3/**
4 * XMLReader::WHITESPACE 定数の使用例。
5 *
6 * この定数は、XMLReaderがXMLドキュメントから読み取ったノードのタイプが
7 * 空白ノード (XML_WHITESPACE) であることを識別するために使用されます。
8 *
9 * XMLReaderは通常、要素間のインデントや改行などの「意味のない」空白ノードをスキップしますが、
10 * `xml:space="preserve"` 属性が指定された要素内の空白は、
11 * XMLReader::WHITESPACE ノードとして報告されることがあります。
12 *
13 * このサンプルコードでは、`xml:space="preserve"` を含むXMLを解析し、
14 * XMLReader::WHITESPACE 定数を使用して空白ノードを検出する方法を示します。
15 */
16function demonstrateXmlReaderWhitespace(): void
17{
18    // xml:space="preserve" を使用したサンプルXMLデータ。
19    // この属性により、要素内の空白(インデント、改行、スペース)が保持され、
20    // XMLReaderによってXML_WHITESPACEノードとして報告される可能性が高まります。
21    $xmlString = <<<XML
22<root>
23    <item xml:space="preserve">
24        これは
25        保持された
26        空白です。
27    </item>
28</root>
29XML;
30
31    $reader = new XMLReader();
32    // XML文字列を読み込みます。
33    $reader->xml($xmlString);
34
35    echo "--- XMLReader::WHITESPACE 定数による空白ノード検出のデモンストレーション ---\n";
36    echo "XMLを読み込み中...\n\n";
37
38    // XMLドキュメントをノードごとに読み進めます。
39    while ($reader->read()) {
40        $nodeType = $reader->nodeType;
41        $nodeName = $reader->name;
42        $nodeValue = $reader->value;
43
44        echo "  ノードタイプ: " . $nodeType . " (";
45        // ノードタイプ定数に対応する文字列名を判別して表示します。
46        switch ($nodeType) {
47            case XMLReader::ELEMENT:
48                echo "ELEMENT";
49                break;
50            case XMLReader::TEXT:
51                echo "TEXT";
52                break;
53            case XMLReader::WHITESPACE:
54                echo "WHITESPACE";
55                break;
56            case XMLReader::END_ELEMENT:
57                echo "END_ELEMENT";
58                break;
59            // その他のノードタイプは簡潔さのため省略します。
60            default:
61                echo "OTHER_TYPE";
62        }
63        echo ")\n";
64        echo "    名前: " . ($nodeName ?: '[なし]') . "\n";
65        // 値が空白の場合も区別できるように引用符で囲み、改行・タブをエスケープして表示します。
66        echo "    値: '" . str_replace(["\n", "\r", "\t"], ['\\n', '\\r', '\\t'], $nodeValue) . "'\n";
67
68        // 現在のノードが XMLReader::WHITESPACE 定数によって表される空白ノードであるかを判定します。
69        if ($nodeType === XMLReader::WHITESPACE) {
70            echo "    --> このノードは XMLReader::WHITESPACE 定数で識別された空白ノードです。\n";
71        }
72        echo "\n";
73    }
74
75    // XMLReaderのリソースを閉じます。
76    $reader->close();
77    echo "--- 処理完了 ---\n";
78}
79
80// 関数を実行します。
81demonstrateXmlReaderWhitespace();
82

PHP 8のXMLReader::WHITESPACE定数は、XMLドキュメントを解析する際に、空白ノードを識別するために用いられます。この定数はXMLReaderクラスに所属し、XMLReaderが読み取ったノードのタイプが空白(XMLのインデントや改行など)であることを示す整数値を保持しています。通常、XMLReaderは要素間の「意味のない」空白を自動的にスキップしますが、XMLドキュメント内でxml:space="preserve"属性が指定されている場合、その要素内の空白はデータの一部として扱われ、XMLReader::WHITESPACEノードとして報告されることがあります。

提供されたサンプルコードは、xml:space="preserve"属性を含むXMLデータをXMLReaderで読み込み、各ノードのタイプを順に確認する例を示しています。while ($reader->read())ループの中で、$reader->nodeTypeXMLReader::WHITESPACEと一致するかどうかを比較することで、空白ノードを具体的に検出する方法を学ぶことができます。この定数自体には引数はなく、特定の値を直接返すものではありませんが、XMLノードの種類を判別する際の比較対象として非常に重要な役割を果たします。XML内の特殊な空白情報を正確に扱いたい場合に活用できます。

この定数は、XMLドキュメント内の空白ノードを識別するために使用されます。初心者の方は、XML解析器が通常スキップするインデントや改行などの空白も、xml:space="preserve"属性が指定された要素内では、XMLReader::WHITESPACEとして検出される場合がある点にご注意ください。この定数は、XMLReaderクラスが読み込んだノードのタイプが空白であることを判定するためのもので、nodeTypeプロパティの値と比較して使用します。XMLReaderは軽量なストリームパーサーであり、解析終了後には必ずclose()メソッドを呼び出してリソースを解放することが重要です。

関連コンテンツ