【PHP8.x】DOMDocument::createElementNS()メソッドの使い方
createElementNSメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
createElementNSメソッドは、DOMDocumentクラスに属し、指定された名前空間URIと要素名を使用して、新しいDOMElementオブジェクトを作成するメソッドです。
このメソッドは、XML文書のDOM操作において、特に要素が名前空間を持つ場合に利用されます。XML文書では、異なるスキーマや語彙で定義された要素を区別するために名前空間が使用されます。例えば、SOAPメッセージやSVGグラフィック、XHTMLなどの、複数のXMLベースの技術を組み合わせて使用する文書を作成する際に、名前空間を正確に扱うことが不可欠となります。
メソッドの第一引数には、作成する要素が属する名前空間のURI(Uniform Resource Identifier)を指定します。これは、名前空間を一意に識別するための文字列です。第二引数には、作成する要素の名前(タグ名)を指定します。このメソッドは、指定された名前空間と要素名を持つ新しいDOMElementオブジェクトを生成し、そのオブジェクトを戻り値として返します。
作成されたDOMElementオブジェクトは、まだどのDOM文書ツリーにも追加されていません。実際に文書に要素を追加するには、appendChild()などのDOMツリー操作メソッドを使用して、既存のノードの子として追加する必要があります。名前空間が不要な単純なXML要素を作成する場合は、createElementメソッドを使用します。createElementNSメソッドは、XML文書の構造を正確に表現し、名前空間の衝突を避けるための強力なツールとして、システム開発において広く利用されています。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$namespaceUri = 'http://example.com/books'; 4$qualifiedName = 'bk:bookTitle'; 5$element = $dom->createElementNS($namespaceUri, $qualifiedName, 'Sample Book Title'); 6?>
引数(parameters)
?string $namespace, string $qualifiedName, string $value = ''
- ?string $namespace: 作成する要素のXML名前空間を指定します。省略可能です。
- string $qualifiedName: 作成する要素の完全修飾名を指定します。
- string $value = '': 作成する要素のテキストコンテンツを指定します。省略可能です。
戻り値(return)
DOMElement|false
指定された名前空間に属する新しい要素ノードを生成して返します。生成に失敗した場合は false を返します。
サンプルコード
PHP DOMDocument::createElementNS で名前空間付きXML要素を作成する
1<?php 2 3/** 4 * DOMDocument::createElementNS メソッドを使用して、名前空間付きのXML要素を作成するサンプル。 5 * システムエンジニアを目指す初心者向けに、XML名前空間の基本的な概念と共に要素作成を示します。 6 */ 7function createXmlWithNamespaces(): void 8{ 9 // 1. 新しいDOMドキュメントを作成 10 // '1.0' はXMLのバージョン、'UTF-8' はエンコーディングを指定 11 $dom = new DOMDocument('1.0', 'UTF-8'); 12 13 // 生成されるXMLを見やすくするために、整形オプションを有効にする 14 $dom->formatOutput = true; 15 16 // XMLで使用する名前空間のURIを定義 17 $mainNamespaceUri = 'http://example.com/ns/main'; 18 $subNamespaceUri = 'http://example.com/ns/sub'; 19 20 // 2. メインの名前空間を持つルート要素を作成 21 // createElementNS(名前空間URI, 修飾名, [要素の値]) 22 // 修飾名 'root' はプレフィックスなしなので、デフォルトの名前空間になる 23 $rootElement = $dom->createElementNS($mainNamespaceUri, 'root'); 24 if ($rootElement === false) { 25 echo "ルート要素の作成に失敗しました。\n"; 26 return; 27 } 28 // 作成したルート要素をDOMドキュメントに追加 29 $dom->appendChild($rootElement); 30 31 // 3. ルート要素と同じ名前空間を持つ子要素を作成 32 // 名前空間URIを指定し、修飾名 'child_a' を使用 33 $childA = $dom->createElementNS($mainNamespaceUri, 'child_a', 'これはメインの名前空間の子要素です。'); 34 if ($childA === false) { 35 echo "child_a 要素の作成に失敗しました。\n"; 36 return; 37 } 38 // 子要素をルート要素に追加 39 $rootElement->appendChild($childA); 40 41 // 4. 異なる名前空間を持つ子要素を作成 42 // サブの名前空間URIを指定し、修飾名 'sub:child_b' を使用 43 // 'sub:' は名前空間プレフィックスであり、要素名の一部として扱われます 44 $childB = $dom->createElementNS($subNamespaceUri, 'sub:child_b', 'これはサブの名前空間の子要素です。'); 45 if ($childB === false) { 46 echo "child_b 要素の作成に失敗しました。\n"; 47 return; 48 } 49 // 子要素をルート要素に追加 50 $rootElement->appendChild($childB); 51 52 // 5. 生成されたXMLを文字列として取得し、出力 53 echo "生成されたXML:\n"; 54 echo $dom->saveXML(); 55} 56 57// 関数を実行してXMLを生成 58createXmlWithNamespaces();
PHPのDOMDocument::createElementNSメソッドは、XMLドキュメント内で「名前空間」を持つ新しいXML要素を作成するために使用されます。XMLの名前空間は、異なるXML語彙(スキーマ)からの要素や属性が混在する際に、要素名の衝突を防ぎ、どの語彙に属するかを明確にする重要な仕組みです。
このメソッドの第一引数$namespaceには、要素が属する名前空間のURI(識別子)を指定します。第二引数$qualifiedNameは、要素の修飾名を指定します。これは「プレフィックス:ローカル名」の形式(例: sub:child_b)でも、プレフィックスなしのローカル名(例: root)でも構いません。プレフィックスなしの場合、その要素は指定された名前空間URIのデフォルト名前空間に属します。第三引数$valueはオプションで、要素のテキスト内容を設定できます。
メソッドは、要素の作成に成功するとDOMElementオブジェクトを返します。失敗した場合はfalseを返しますので、エラーハンドリングを行うことが推奨されます。
サンプルコードでは、まずDOMDocumentオブジェクトを生成し、formatOutputをtrueに設定して出力XMLを見やすくします。次に、異なる名前空間URIを定義し、それらを使用してルート要素や子要素を作成しています。例えば、$dom->createElementNS($mainNamespaceUri, 'root')でメインの名前空間に属するルート要素を作り、$dom->createElementNS($subNamespaceUri, 'sub:child_b')でサブの名前空間に属する子要素を作成しています。作成した要素はappendChildメソッドでXMLツリーに追加され、最終的にsaveXML()で完成したXMLが出力されます。
このサンプルコードは、名前空間付きのXML要素を生成するcreateElementNSメソッドの基本的な使い方を示しています。特に、第1引数で指定する名前空間URIと、第2引数で指定する修飾名の関連性を正しく理解することが重要です。修飾名にプレフィックスを含めるか否かで、生成されるXMLの表現が変わりますが、実際の名前空間はURIで定義されます。このメソッドは失敗した場合にfalseを返すため、必ずif ($element === false)のように戻り値をチェックし、エラーハンドリングを行うことが安全なコードの基本です。名前空間URIは要素名や属性名の衝突を防ぐユニークな識別子として機能します。また、$dom->formatOutput = true;を設定すると、生成されるXMLが整形され、確認しやすくなります。
PHP DOMDocument createElementNSで名前空間付きXML要素を作成する
1<?php 2 3/** 4 * DOMDocument::createElementNS の使用例 5 * 6 * 名前空間を持つXML要素を生成し、DOMドキュメントに追加する方法を示します。 7 * システムエンジニアを目指す初心者向けに、基本的なXML要素の作成フローを簡潔に示します。 8 */ 9function createXmlWithNamespaceElements(): string 10{ 11 // 1. DOMDocument オブジェクトを初期化 12 // '1.0' はXMLのバージョン、'UTF-8' はエンコーディングを指定します。 13 $dom = new DOMDocument('1.0', 'UTF-8'); 14 15 // 2. 出力を見やすくするために、XMLを整形する設定を有効にします。 16 $dom->formatOutput = true; 17 18 // 3. 名前空間URIと、その名前空間に紐づけるプレフィックスを定義します。 19 $namespaceUri = 'http://example.com/mynamespace'; 20 $prefix = 'my'; 21 22 // 4. ルート要素を createElementNS で作成します。 23 // 引数: 名前空間URI, プレフィックス付き要素名, 要素のテキスト値 (オプション) 24 // この例では、ルート要素にはテキスト値を与えず、子要素に与えます。 25 $rootElement = $dom->createElementNS($namespaceUri, "$prefix:data"); 26 27 // 5. 作成したルート要素を DOM ドキュメントに追加します。 28 $dom->appendChild($rootElement); 29 30 // 6. 子要素を createElementNS で作成し、テキスト値を設定します。 31 $itemElement = $dom->createElementNS($namespaceUri, "$prefix:item", "サンプル値"); 32 33 // 7. 子要素をルート要素に追加します。 34 $rootElement->appendChild($itemElement); 35 36 // 8. 作成されたDOMツリーをXML形式の文字列として取得し、返却します。 37 return $dom->saveXML(); 38} 39 40// 関数を実行し、生成されたXMLを出力します。 41echo createXmlWithNamespaceElements(); 42 43?>
PHP 8のDOMDocumentクラスが提供するcreateElementNSメソッドは、XML文書内で名前空間を持つ新しい要素を生成するために使用されます。このメソッドは、一般的なXML要素を作成するcreateElementとは異なり、要素が属する名前空間を明確に指定できる点が特徴です。
引数には、第一に要素が属する名前空間のURI(通常はURL形式の文字列)を、第二にプレフィックス:要素名の形式で指定する修飾名を文字列で渡します。第三引数はオプションで、作成する要素に初期値として設定するテキストを指定できます。このメソッドが正常に実行されると、新しく作成されたDOMElementオブジェクトが返されますが、要素の作成に失敗した場合はfalseが返されます。
サンプルコードでは、まずDOMDocumentオブジェクトを初期化し、XMLの整形を有効にしています。その後、特定の名前空間URIと、それに対応するmyというプレフィックスを定義しています。createElementNSメソッドを使って、この名前空間に属するmy:dataというルート要素と、その子要素となるmy:item要素を作成しています。作成された要素はappendChildメソッドでDOMツリーに追加され、最終的にsaveXML()メソッドにより、名前空間が適切に適用されたXML文字列として出力されます。これにより、複雑なXML構造も名前空間を考慮して効率的に構築できます。
createElementNSメソッドでは、第一引数に一意な名前空間URIを、第二引数にはプレフィックス:要素名という完全修飾名を渡す必要があります。要素作成が失敗した場合にはfalseを返す可能性があるため、本格的な利用では戻り値のチェックとエラー処理を組み込むことが重要です。作成した要素は、必ずappendChildメソッドを使ってDOMツリー上の適切な親要素に追加しなければ、XMLドキュメントの一部にはなりません。名前空間は、異なるシステム間でXML要素名が重複するのを防ぎ、XML文書の信頼性を高める大切な役割を持っています。また、formatOutputは出力を見やすくするための設定であり、実運用ではパフォーマンスを考慮し、無効にすることもあります。