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

【PHP8.x】Dom\XMLDocument::nodeValueプロパティの使い方

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

作成日: 更新日:

基本的な使い方

nodeValueプロパティは、DOMツリーにおける各ノードが持つテキスト値を取得または設定するために設計されたプロパティです。しかし、このプロパティが所属するDOM\XMLDocumentクラスのオブジェクトは、XMLドキュメント全体のルートノードを表します。ドキュメントノード自体は、HTMLの要素やテキスト、コメントのように具体的なテキストコンテンツを直接保持しません。

そのため、DOM\XMLDocumentオブジェクトのnodeValueプロパティにアクセスした場合、常にnullが返されます。このプロパティに何らかの文字列値を設定しようとしても、ドキュメントオブジェクトの構造や内容には実際の影響を与えません。

nodeValueプロパティが有効に機能するのは、DOM\Text(テキストノード)、DOM\Attr(属性ノード)、DOM\Comment(コメントノード)などのように、直接的にテキストデータを保持するノードタイプに対してです。これらのノードでは、nodeValueプロパティを通じてその内容を読み取ったり、変更したりすることができます。DOM\XMLDocumentオブジェクトでコンテンツを操作する際は、代わりにdocumentElementプロパティを通じてルート要素にアクセスし、その子ノードや属性を操作することになります。

構文(syntax)

1<?php
2
3$document = new Dom\XMLDocument();
4$nodeValue = $document->nodeValue;

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|null

このプロパティは、XMLノードのテキストコンテンツを文字列として返します。ノードにテキストコンテンツがない場合はnullを返します。

サンプルコード

PHP DOMDocument nodeValue 取得

1<?php
2
3/**
4 * XML文字列から特定の要素のnodeValueを取得し、配列で返す関数。
5 *
6 * この関数は、システムエンジニアを目指す初心者の方にも、
7 * PHPのDOMDocumentクラスとnodeValueプロパティの基本的な使い方を理解してもらうことを目的としています。
8 *
9 * @param string $xmlString 解析対象のXML文字列。
10 * @param string $tagName 取得したい値が含まれる要素のタグ名。
11 * @return array<string> 指定されたタグ名を持つ要素から抽出されたnodeValueの配列。
12 *                       XMLの読み込みに失敗した場合や、該当する要素がない場合は空の配列を返します。
13 */
14function getTagNodeValues(string $xmlString, string $tagName): array
15{
16    // 1. DOMDocumentオブジェクトを初期化します。
17    //    これはXMLドキュメント全体を操作するためのクラスです。
18    $dom = new DOMDocument();
19
20    // 2. XMLの読み込みオプションを設定します。
21    //    `preserveWhiteSpace` を `false` に設定すると、要素の間の改行やインデントなどの
22    //    余分な空白文字がテキストノードとして扱われなくなり、`nodeValue` がよりきれいに取得できます。
23    $dom->preserveWhiteSpace = false;
24
25    // 3. XML文字列をDOMDocumentに読み込みます。
26    //    `loadXML()` メソッドはXMLの解析に成功した場合に `true` を、失敗した場合に `false` を返します。
27    //    エラーが発生した場合は処理を中断し、空の配列を返します。
28    if (!$dom->loadXML($xmlString)) {
29        // エラーが発生したことをユーザーに知らせます。
30        echo "エラー: XML文字列の読み込みに失敗しました。\n";
31        return [];
32    }
33
34    // 4. 指定されたタグ名を持つすべての要素ノードを取得します。
35    //    `getElementsByTagName()` は、DOMNodeListオブジェクトを返します。
36    //    これは、取得された要素のコレクション(リスト)です。
37    $elements = $dom->getElementsByTagName($tagName);
38
39    $nodeValues = [];
40    // 5. 取得した各要素をループ処理し、`nodeValue` プロパティにアクセスします。
41    foreach ($elements as $element) {
42        // `nodeValue` プロパティは、ノードのテキストコンテンツを返します。
43        // 要素ノードの場合、そのノードの子孫(子や孫など)に存在するすべてのテキストノードの連結された値を返します。
44        // テキストコンテンツがない場合は空文字列を返します。
45        // PHPのリファレンスにある通り、戻り値は `string` または `null` ですが、
46        // 要素ノードの場合は通常 `string` (空文字列を含む) になります。
47        $nodeValues[] = $element->nodeValue;
48    }
49
50    // 6. 抽出したnodeValueの配列を返します。
51    return $nodeValues;
52}
53
54// --- サンプルコードの使用例 ---
55
56// XMLデータをヒアドキュメント形式で定義します。
57$xmlData = <<<XML
58<?xml version="1.0" encoding="UTF-8"?>
59<books>
60    <book id="1">
61        <title>PHPを学ぶ</title>
62        <author>山田 太郎</author>
63    </book>
64    <book id="2">
65        <title>JavaScriptの基本</title>
66        <author>田中 花子</author>
67    </book>
68    <magazine>
69        <title>Web開発ニュース</title>
70    </magazine>
71    <empty-tag></empty-tag>
72</books>
73XML;
74
75echo "--- 'title' タグのnodeValueを取得 ---\n";
76$titles = getTagNodeValues($xmlData, 'title');
77if (!empty($titles)) {
78    foreach ($titles as $title) {
79        echo "タイトル: " . $title . "\n";
80    }
81} else {
82    echo "エラーまたは該当するタイトルが見つかりませんでした。\n";
83}
84
85echo "\n--- 'author' タグのnodeValueを取得 ---\n";
86$authors = getTagNodeValues($xmlData, 'author');
87if (!empty($authors)) {
88    foreach ($authors as $author) {
89        echo "著者: " . $author . "\n";
90    }
91} else {
92    echo "エラーまたは該当する著者が見つかりませんでした。\n";
93}
94
95echo "\n--- 'empty-tag' タグのnodeValueを取得 ---\n";
96$emptyTagValues = getTagNodeValues($xmlData, 'empty-tag');
97if (!empty($emptyTagValues)) {
98    foreach ($emptyTagValues as $value) {
99        // 空の要素のnodeValueは、通常、空文字列になります。
100        echo "空タグの値: '" . $value . "'\n";
101    }
102} else {
103    echo "エラーまたは該当する空タグが見つかりませんでした。\n";
104}
105
106echo "\n--- 存在しないタグ 'publisher' のnodeValueを取得 ---\n";
107$publishers = getTagNodeValues($xmlData, 'publisher');
108if (empty($publishers)) {
109    echo "コメント: 'publisher' タグは見つかりませんでした (これは期待通りの結果です)。\n";
110}
111
112echo "\n--- 不正なXMLのテスト ---\n";
113// 閉じタグが不一致な不正なXML文字列を渡します。
114$invalidXmlData = "<root><item>テスト</invalid-item>";
115getTagNodeValues($invalidXmlData, 'item'); // エラーメッセージが出力されます。

PHPにおけるXML操作の基本を学ぶためのサンプルコードです。このコードは、PHPのDOMDocumentクラスとnodeValueプロパティを利用して、XML文字列の中から指定したタグ名の要素のテキスト内容(nodeValue)を抽出する関数を定義しています。DOMDocumentはXMLドキュメント全体をオブジェクトとして操作するためのクラスで、その各要素や属性は「ノード」として扱われます。nodeValueプロパティは、このノードの持つテキストコンテンツを文字列として取得するために用いられます。リファレンスに示される通り、戻り値はstringまたはnullですが、通常のテキストを持つ要素ノードからはstring(空文字を含む)が返されます。

getTagNodeValues関数は、第一引数に解析対象のXML文字列、第二引数に取得したい要素のタグ名を受け取り、該当するすべての要素から抽出したnodeValueを文字列の配列として返します。関数内部では、まずDOMDocumentオブジェクトを初期化し、loadXMLメソッドでXML文字列を読み込みます。その後、getElementsByTagNameメソッドで指定されたタグ名の要素コレクションを取得し、各要素をループ処理してnodeValueプロパティから値を取り出しています。XMLの読み込みが失敗した場合や、指定したタグ名の要素が見つからない場合は、空の配列が返されます。このサンプルは、XMLデータから特定の情報を抽出する基本的なパターンを示しており、システムエンジニアを目指す上で重要なスキルの一つです。

nodeValueプロパティは、XML要素のタグに囲まれた純粋なテキスト内容を取得する際に使用します。要素の属性値や子要素のタグ自体は含まれませんので、目的のテキストだけを取り出す場合に適しています。リファレンスでは戻り値がstring|nullとありますが、要素ノードに対して利用する場合、通常は内容が空でもstring型(空文字列)で返され、nullになることは非常に稀です。

サンプルコードにある$dom->preserveWhiteSpace = false;の設定は重要です。これを指定しないと、XMLの整形のための改行やインデントなどの空白文字がnodeValueに含まれてしまい、意図しない値になることがありますので注意してください。また、$dom->loadXML()はXMLの解析に失敗する可能性があります。必ず戻り値をチェックし、エラーハンドリングを行うことで、不正なXML入力によるプログラムの異常終了を防ぎ、安全性を確保してください。

PHP DomDocument nodeValueとtextContentの比較

1<?php
2
3// Dom\XMLDocument の nodeValue プロパティと textContent プロパティの比較
4
5// XML 文字列をロード
6$xmlString = <<<XML
7<root>
8  <element>This is some text.</element>
9  <element><![CDATA[This is CDATA text.]]></element>
10  <element>This is <b>bold</b> text.</element>
11</root>
12XML;
13
14$dom = new DOMDocument();
15$dom->loadXML($xmlString);
16
17// element ノードを取得
18$elements = $dom->getElementsByTagName('element');
19
20// 各 element ノードについて nodeValue と textContent を比較
21foreach ($elements as $element) {
22    echo "Node Name: " . $element->nodeName . "\n";
23    echo "nodeValue: " . $element->nodeValue . "\n";
24    echo "textContent: " . $element->textContent . "\n";
25    echo "---\n";
26}
27
28// 出力:
29// Node Name: element
30// nodeValue: This is some text.
31// textContent: This is some text.
32// ---
33// Node Name: element
34// nodeValue: This is CDATA text.
35// textContent: This is CDATA text.
36// ---
37// Node Name: element
38// nodeValue: This is bold text.
39// textContent: This is This is bold text.
40// ---
41
42// nodeValue は、CDATAセクションを適切に処理し、HTMLタグを削除します。
43// textContent は、HTMLタグを含むすべてのテキストコンテンツを返します。

PHP 8におけるDom\XMLDocumentクラスのnodeValueプロパティについて解説します。nodeValueは、XMLドキュメント内のノードが持つテキスト値を文字列として取得するためのプロパティです。引数はなく、戻り値は文字列型(string)またはnullです。

サンプルコードでは、XML文字列を読み込み、<element>タグを持つ各ノードに対してnodeValuetextContentプロパティの値を比較しています。nodeValueは、CDATAセクション内のテキストを適切に処理し、HTMLタグなどのマークアップを削除したテキストを返します。一方、textContentはノード内のすべてのテキストコンテンツを返し、HTMLタグなどのマークアップもそのまま含まれます。

例えば、<b>bold</b>というタグを含む要素の場合、nodeValueは"bold text"を返し、textContentは"This is bold text."を返します。CDATAセクションの場合、nodeValuetextContentはどちらもCDATAセクション内のテキストをそのまま返します。

nodeValueは、XMLドキュメントからテキストデータのみを抽出したい場合に役立ちます。一方、textContentは、ノード内のすべてのテキストコンテンツを取得したい場合に適しています。XMLを扱う際、これらのプロパティの違いを理解することで、より柔軟なデータ処理が可能になります。

nodeValuetextContentは、どちらもノードのテキスト情報を取得するプロパティですが、挙動が異なります。nodeValueは、ノードの種類によって返す値が変わり、要素ノードの場合は子孫ノードのテキストコンテンツを連結したものを返します。CDATAセクションは適切に処理されますが、HTMLタグは削除されます。一方、textContentは、ノードとその子孫ノードのテキストコンテンツをすべて連結して返します。HTMLタグもそのまま含まれます。この違いを理解し、目的に応じて使い分けることが重要です。nodeValuenullを返す場合があることにも注意してください。XMLドキュメントの構造を意識し、適切なプロパティを選択することで、意図した通りのテキスト情報を取得できます。

関連コンテンツ

関連プログラミング言語