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

【PHP8.x】DOMCdataSection::appendChild()メソッドの使い方

appendChildメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

appendChildメソッドは、XMLやHTMLドキュメントのCDATAセクションを表すDOMCdataSectionクラスに属し、指定されたDOMノードを現在のCDATAセクションノードの子ノードリストの末尾に追加するメソッドです。DOMCdataSectionクラスは、XMLやHTMLドキュメントにおいて、マークアップとして解釈されずにそのままのテキストデータとして扱われるCDATAセクションを表現します。

このメソッドは、引数として追加したいDOMノードを受け取り、そのノードを現在のCDATAセクションノードの新しい子ノードとして追加します。追加が成功すると、追加されたノード自身が戻り値として返されます。もし引数で渡されたノードが既にDOMツリー内の別の場所に存在していた場合、そのノードは元の場所から削除されてから、現在のCDATAセクションノードの子として追加されます。

通常、CDATAセクションは内部にプレーンなテキストコンテンツを持つため、その子ノードとしてさらに構造を持つ他の要素ノードなどを追加するケースは稀です。しかし、PHPのDOM拡張機能が提供するDOMNodeインターフェースの共通機能として、DOMCdataSectionインスタンスに対してもこのappendChildメソッドを利用できます。これは、XMLやHTMLドキュメントの構造をプログラムから柔軟に操作するための、DOMツリー操作の基本的な機能の一つです。

構文(syntax)

1<?php
2$cdataSection = new DOMCdataSection('テキストデータ');
3$newChildNode = new DOMElement('子要素');
4$appendedNode = $cdataSection->appendChild($newChildNode);
5?>

引数(parameters)

DOMNode $node

  • DOMNode $node: 追加する子ノードを指定するDOMNodeオブジェクト

戻り値(return)

DOMNode

DOMCdataSection::appendChildメソッドは、指定されたノードをCDATAセクションの末尾に追加し、追加されたDOMNodeオブジェクトを返します。

サンプルコード

PHP DOM CDATAセクションをappendChildする

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOM要素にCDATAセクションをappendChildで追加するサンプルです。
7 *
8 * このコードは、XMLドキュメントを作成し、
9 * 特定の要素内にスクリプトやマークアップなどの特殊文字を含むテキストを
10 * 安全に埋め込むためのCDATAセクションを追加する方法を示します。
11 */
12function createXmlWithCdata(): void
13{
14    try {
15        // DOMDocumentオブジェクトを初期化
16        $dom = new DOMDocument('1.0', 'UTF-8');
17
18        // 出力されるXMLをきれいに整形する設定
19        $dom->formatOutput = true;
20
21        // ルート要素<root>を作成
22        $rootElement = $dom->createElement('root');
23
24        // <script>要素を作成
25        $scriptElement = $dom->createElement('script');
26
27        // CDATAセクションに含めるコンテンツを定義
28        // この中では、<, >, & などの文字をエスケープする必要がない
29        $cdataContent = 'if (x < 10 && y > 5) { alert("CDATA content!"); }';
30
31        // CDATAセクションノードを作成
32        $cdataNode = $dom->createCDATASection($cdataContent);
33
34        // <script>要素にCDATAセクションノードを子として追加 (appendChild)
35        $scriptElement->appendChild($cdataNode);
36
37        // ルート要素に<script>要素を子として追加
38        $rootElement->appendChild($scriptElement);
39
40        // ドキュメントにルート要素を追加
41        $dom->appendChild($rootElement);
42
43        // WebブラウザでXMLとして正しく表示するためにContent-Typeヘッダーを設定
44        header('Content-Type: application/xml; charset=utf-8');
45
46        // 生成されたXMLを出力
47        echo $dom->saveXML();
48
49    } catch (DOMException $e) {
50        // DOM操作中にエラーが発生した場合の処理
51        header('Content-Type: text/plain; charset=utf-8', true, 500);
52        echo 'エラー: ' . $e->getMessage();
53    }
54}
55
56// 関数を実行してXMLを生成・出力
57createXmlWithCdata();
58
59/*
60出力結果:
61
62<?xml version="1.0" encoding="UTF-8"?>
63<root>
64  <script><

このPHPサンプルコードは、DOM拡張機能を利用してXMLドキュメントをプログラムで生成する方法を示しています。特に、JavaScriptコードのような特殊文字を含むテキストを、XMLパーサーに誤って解釈されることなく安全に埋め込むためのCDATAセクションを作成し、要素に追加する例です。

中心となる appendChild メソッドは、指定した要素を、ある要素の子要素リストの末尾に追加する役割を持ちます。このメソッドで親子関係を構築することで、XMLの階層構造を作り上げます。引数には、子として追加したいノード(要素、テキスト、CDATAセクションなど)を指定します。処理が成功すると、追加したノード自身が戻り値として返されます。

コードの処理の流れとして、まず DOMDocument でXML文書全体を管理するオブジェクトを作成します。次に createElement<root><script> といった要素を、createCDATASection でCDATAセクションをそれぞれ個別に作成します。そして、appendChild を複数回呼び出し、<script> 要素の中にCDATAセクションを、<root> 要素の中に <script> 要素を、というように入れ子構造を組み立てています。最後に、完成したXML構造を saveXML メソッドで文字列として出力します。

このサンプルコードで使われているappendChildは、<script>要素のようなDOMElementに対して子ノードを追加するメソッドです。指定されたリファレンス情報とは異なり、CDATAセクションノード自身にappendChildを実行することはできません。なぜなら、CDATAセクションは子ノードを持てないテキストデータのかたまりだからです。CDATAセクションの正しい使い方は、createCDATASectionで作成し、それを他の要素の子として追加することです。これにより、<&などの特殊文字をエスケープせず安全にXMLへ埋め込めます。また、文字化けを防ぐため、DOMDocumentの初期化とheader関数で文字コードを明示的に指定することが重要です。

PHP SimpleXMLでCDATAセクションを追加する

1<?php
2
3/**
4 * DOMCdataSection を含む XML ドキュメントを生成し、SimpleXML に変換して表示する関数。
5 * システムエンジニアを目指す初心者向けに、DOM と SimpleXML の連携を示します。
6 */
7function createXmlWithCdataAndDisplay(): void
8{
9    // 1. DOMDocument オブジェクトを作成
10    $dom = new DOMDocument('1.0', 'UTF-8');
11    $dom->formatOutput = true; // 出力時にXMLを整形する
12
13    // 2. ルート要素 'data' を作成し、DOM ドキュメントに追加
14    $root = $dom->createElement('data');
15    $dom->appendChild($root);
16
17    // 3. 子要素 'item' を作成し、ルート要素に追加
18    $item = $dom->createElement('item');
19    $root->appendChild($item);
20
21    // 4. CDATA セクションを作成
22    // DOMCdataSection は DOMNode の子孫クラスであり、appendChild の引数として渡せます。
23    // CDATA セクション自体は XML の仕様上、子ノードを持つことはできません。
24    $cdataContent = '<name>Alice & Bob</name> is cool.';
25    $cdata = $dom->createCDATASection($cdataContent);
26
27    // 5. CDATA セクションを 'item' 要素の子として追加
28    // ここで親ノード (DOMElement) の appendChild メソッドが使用され、
29    // DOMCdataSection オブジェクトが引数として渡されます。
30    $item->appendChild($cdata);
31
32    // 6. もう一つの子要素 'description' を作成し、ルート要素に追加
33    $description = $dom->createElement('description', 'This is a regular text.');
34    $root->appendChild($description);
35
36    // 7. 生成された DOM ドキュメントを XML 文字列として取得し、表示
37    echo "--- DOM Document Output ---\n";
38    echo $dom->saveXML();
39    echo "\n";
40
41    // 8. DOM ドキュメントを SimpleXMLElement オブジェクトに変換
42    // キーワード 'simplexml' に関連する操作として、DOM を SimpleXML にインポートします。
43    $sxe = simplexml_import_dom($dom);
44
45    // 9. SimpleXML オブジェクトの内容を表示
46    echo "--- SimpleXML Output ---\n";
47    echo $sxe->asXML();
48}
49
50// 関数を実行してサンプルコードの動作を確認
51createXmlWithCdataAndDisplay();

このサンプルコードは、PHPのDOM拡張機能を利用してXMLドキュメントを構築し、特にCDATAセクションの扱いとSimpleXMLへの変換方法を示しています。

まず、DOMDocumentオブジェクトを作成し、createElementメソッドでXMLの要素(例: dataitem)を生成します。これらの要素は、親ノードのappendChildメソッドを使ってXMLツリーの中に階層的に追加されます。appendChildメソッドは、引数にDOMNode型のオブジェクト(例えば、生成した要素やテキストノード)を受け取り、それを呼び出し元のノードの最後の子として追加します。メソッドの戻り値は、実際に追加された子ノードそのものです。

コードの中では、<name>Alice & Bob</name> is cool.という文字列を扱うためにDOMCdataSectionを作成しています。CDATAセクションは、XMLの構文と衝突する可能性のある文字をデータとしてそのまま含めたい場合に用いられます。$dom->createCDATASection()で作成したDOMCdataSectionオブジェクトもDOMNodeの一種であるため、$item->appendChild($cdata)のように親要素のappendChildメソッドに引数として渡し、XMLドキュメントに組み込むことができます。

最終的に、構築されたDOMドキュメントはsimplexml_import_dom()関数を使ってSimpleXMLElementオブジェクトに変換されます。これにより、DOMで作成した複雑なXML構造を、SimpleXMLを使ってより簡潔に操作できるようになり、PHPにおけるXMLデータの生成と操作の基礎を学べます。

このコードでは、親要素のappendChildメソッドを使ってDOMCdataSectionオブジェクトを子ノードとして追加しています。DOMCdataSectionクラス自体にはappendChildメソッドは存在せず、子ノードを持つことはできませんのでご注意ください。CDATAセクションは、XMLパーサーが内容をマークアップとして解釈せず、特殊文字をエスケープせずにそのまま扱ってほしい場合に利用します。simplexml_import_domでSimpleXMLに変換すると、CDATAセクションの内容は通常のテキストとして扱われます。XML構造の複雑な操作にはDOMを、簡潔なデータアクセスにはSimpleXMLを使い分けるのが良いでしょう。

関連コンテンツ

関連プログラミング言語

【PHP8.x】DOMCdataSection::appendChild()メソッドの使い方 | いっしー@Webエンジニア