【PHP8.x】DOMProcessingInstruction::textContentプロパティの使い方
textContentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『textContentプロパティは、処理命令ノード(DOMProcessingInstruction)のテキストコンテンツを保持するプロパティです。処理命令ノードとは、XMLやHTML文書内において <? と ?> で囲まれた部分で、文書を処理するアプリケーションへの指示を記述するために使われます。例えば、<?xml-stylesheet href="style.css"?> という記述が処理命令ノードにあたります。このプロパティは、処理命令のターゲット(この例では xml-stylesheet)に続くデータ部分(この例では href="style.css")の文字列を取得、または設定するために使用されます。このプロパティから値を取得すると、ターゲット名の直後の空白文字から始まるデータ全体の文字列が返されます。逆に、このプロパティに新しい文字列を代入することで、処理命令のデータ部分を動的に変更することが可能です。DOMProcessingInstructionクラスにおいて、textContentプロパティは data プロパティと機能的に同じであり、常に同じ値を返します。』
構文(syntax)
1<?php 2 3$xml = '<?xml version="1.0" encoding="utf-8"?> 4<book> 5 <?xml-stylesheet type="text/css" href="style.css"?> 6 <title>PHP Manual</title> 7</book>'; 8 9$doc = new DOMDocument(); 10$doc->loadXML($xml); 11 12// DOMProcessingInstruction ノードを取得します 13$pi = $doc->firstChild->nextSibling; 14 15// textContent プロパティで処理命令のデータを取得して表示します 16// 出力: type="text/css" href="style.css" 17echo $pi->textContent . PHP_EOL; 18 19// textContent プロパティに新しいデータを設定します 20$pi->textContent = 'type="text/xsl" href="transform.xsl"'; 21 22// 変更後のXML全体を出力します 23echo $doc->saveXML(); 24 25?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
DOMProcessingInstruction オブジェクトが表す処理命令ノードのテキスト内容を文字列で返します。ノードにテキスト内容がない場合は null を返します。
サンプルコード
PHP DOMDocument textContentで処理命令を取得する
1<?php 2 3/** 4 * DOMProcessingInstructionのtextContentプロパティの使用例を示します。 5 * 6 * XMLドキュメントに含まれる処理命令(Processing Instruction)を検出し、 7 * その内容をtextContentプロパティを使って取得・表示します。 8 */ 9function showProcessingInstructionContent(): void 10{ 11 // 処理命令 <?xml-stylesheet ... ?> を含むXML文字列を定義します。 12 $xmlString = <<<XML 13<?xml version="1.0" encoding="UTF-8"?> 14<?xml-stylesheet href="style.css" type="text/css"?> 15<root> 16 <element>Some text</element> 17</root> 18XML; 19 20 // DOMDocumentオブジェクトを生成します。 21 $doc = new DOMDocument(); 22 23 // XML文字列を読み込み、DOMツリーを構築します。 24 $doc->loadXML($xmlString); 25 26 // ドキュメントのすべての子ノードを順番に確認します。 27 foreach ($doc->childNodes as $node) { 28 // ノードの種類が処理命令(Processing Instruction)であるかを確認します。 29 // 例: <?xml-stylesheet ... ?> 30 if ($node instanceof DOMProcessingInstruction) { 31 // 処理命令のターゲット名(例: 'xml-stylesheet')を取得します。 32 $target = $node->target; 33 34 // 処理命令の内容(ターゲット名に続く文字列)をtextContentプロパティで取得します。 35 // この例では 'href="style.css" type="text/css"' が取得されます。 36 $textContent = $node->textContent; 37 38 echo "処理命令が見つかりました。" . PHP_EOL; 39 echo "ターゲット (target): " . $target . PHP_EOL; 40 echo "内容 (textContent): " . $textContent . PHP_EOL; 41 } 42 } 43} 44 45// 関数を実行します。 46showProcessingInstructionContent(); 47 48?>
PHPのDOMProcessingInstructionクラスに属するtextContentプロパティは、XMLドキュメント内の処理命令(Processing Instruction)の内容を取得するために使用します。処理命令とは、<?と?>で囲まれた、アプリケーションに特定の指示を与えるための記述です。
サンプルコードでは、まずDOMDocumentクラスを使ってXML文字列を解析し、プログラムが扱えるオブジェクト構造に変換しています。次に、ドキュメント内の各ノードを順番に確認し、そのノードが処理命令(DOMProcessingInstructionオブジェクト)であるかをinstanceof演算子で判定します。
処理命令が見つかると、textContentプロパティにアクセスしてその内容を取得します。このプロパティは引数を取らず、戻り値として処理命令の内容を文字列(string)で返します。内容が存在しない場合はnullを返すことがあります。サンプルコードの<?xml-stylesheet href="style.css" type="text/css"?>という処理命令の場合、textContentはターゲット名であるxml-stylesheetを除いた、href="style.css" type="text/css"という文字列を取得します。このように、textContentプロパティは、処理命令のターゲット名に続く具体的な指示内容を取り出す際に役立ちます。
DOMProcessingInstructionのtextContentプロパティは、処理命令のターゲット名(例: xml-stylesheet)を含まず、それに続くデータ部分の文字列のみを返します。ターゲット名はtargetプロパティで別途取得する必要があります。このクラスにおいては、textContentとnodeValueプロパティは同じ内容を返すため、どちらを使用しても結果は変わりません。また、loadXML関数は不正な形式のXML文字列を読み込むと失敗する可能性があるため、実際のアプリケーションではエラーハンドリングを行うことが推奨されます。ループ処理でノードを調べる際は、instanceofで種類を正確に判定することが重要です。
PHP DOM ProcessingInstructionのtextContentを操作する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMProcessingInstruction::textContent プロパティの使用例です。 7 * 8 * この関数は、XML文字列内の処理命令ノード(PI)を検索し、 9 * その内容 (データ部分) を `textContent` プロパティで取得・更新する方法を示します。 10 */ 11function demonstrateDomPiTextContent(): void 12{ 13 // 処理命令 `<?php-app ...?>` を含むXML文字列を準備 14 $xmlString = <<<XML 15<?xml version="1.0" encoding="UTF-8"?> 16<root> 17 <config> 18 <?php-app version="1.0" mode="production"?> 19 </config> 20 <data> 21 <item>Apple</item> 22 </data> 23</root> 24XML; 25 26 // DOMDocumentオブジェクトを生成し、XMLを読み込む 27 $dom = new DOMDocument(); 28 $dom->loadXML($xmlString); 29 30 // XPathを使ってターゲットが 'php-app' の処理命令ノードを検索する 31 $xpath = new DOMXPath($dom); 32 $nodeList = $xpath->query('//processing-instruction("php-app")'); 33 34 // 発見したノード(DOMProcessingInstruction)を処理する 35 if ($nodeList && $nodeList->length > 0) { 36 /** @var DOMProcessingInstruction $piNode */ 37 $piNode = $nodeList->item(0); 38 39 echo "処理命令のターゲット: " . $piNode->target . PHP_EOL; 40 41 // textContentプロパティで処理命令のデータ部分を取得して表示 42 echo "元のtextContent: " . $piNode->textContent . PHP_EOL; 43 44 // textContentプロパティに新しい値を代入してデータを更新 45 $piNode->textContent = 'version="2.0" mode="development"'; 46 47 echo "更新後のtextContent: " . $piNode->textContent . PHP_EOL; 48 echo "---" . PHP_EOL; 49 } 50 51 // 変更が反映されたXMLドキュメント全体を出力 52 $dom->formatOutput = true; // 出力を読みやすく整形する 53 echo "変更後のXML全体:" . PHP_EOL; 54 echo $dom->saveXML(); 55} 56 57// 関数を実行して結果を表示 58demonstrateDomPiTextContent(); 59 60?>
PHPのDOMProcessingInstruction::textContentは、XMLの処理命令ノード(Processing Instruction, PI)が持つデータ部分のテキスト内容を取得したり、新しく設定したりするためのプロパティです。処理命令とは、<?target data?>という形式で記述され、XMLを処理するアプリケーションに特定の指示を与えるためのものです。
このプロパティにアクセスすると、処理命令の「ターゲット」部分(例:<?php-app ...?>におけるphp-app)を除いた、「データ」部分(例:version="1.0" mode="production")を文字列として取得できます。戻り値はデータ部分の文字列ですが、状況によってはnullを返す場合もあります。逆に、このプロパティに新しい文字列を代入すると、その処理命令のデータ部分を簡単に書き換えることができます。
サンプルコードでは、まずXML文字列を読み込み、XPathを使って<?php-app ...?>という処理命令ノードを探しています。そして、見つかったノードのtextContentプロパティを参照して元のデータ部分を表示し、次に新しい文字列を代入して内容を更新しています。最後に、更新後のXML全体を出力することで、処理命令のデータが書き換わっていることを確認できます。このようにtextContentプロパティは、処理命令の具体的な指示内容をプログラムで動的に読み書きする際に役立ちます。
DOMProcessingInstructionのtextContentプロパティは、処理命令ノードにおいて、ターゲット名を除いたデータ部分の文字列を取得、または設定するために使います。dataプロパティも同じ役割を持ち、実質的に同じものです。サンプルコードのようにXPathでノードを検索した後は、対象が見つからない場合にエラーとなるのを防ぐため、if文でノードの存在を必ず確認してください。このプロパティに新しい文字列を代入すると、DOMオブジェクト内のデータが直接更新され、saveXML()で出力するXMLにもその変更が反映されます。コード中の@varコメントは、変数の型を明確にし、開発ツールによる支援を受けやすくするための良い習慣です。