【PHP8.x】nodeNameプロパティの使い方

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

作成日: 更新日:

基本的な使い方

nodeNameプロパティは、ノードの名前を保持するプロパティです。DOMNameSpaceNodeクラスに属し、名前空間ノードの名前を取得するために使用されます。具体的には、ノードが要素ノードであれば要素名、属性ノードであれば属性名、テキストノードであれば #text 、コメントノードであれば #comment 、ドキュメントノードであれば #document といった文字列が格納されます。

このプロパティは読み取り専用であり、直接値を変更することはできません。ノードの名前を変更するには、適切なDOM操作メソッド(例えば、DOMElement::tagName プロパティを変更するなど)を使用する必要があります。nodeNameプロパティの値は、ノードの種類によって異なるため、ノードの種類を事前に確認した上で利用することが推奨されます。

例えば、XMLドキュメントを解析し、特定の要素の名前を取得したい場合に、DOMNameSpaceNode オブジェクトの nodeName プロパティを参照することで、要素名を取得できます。取得した名前は、条件分岐やログ出力など、様々な処理に利用できます。nodeNameプロパティは、DOMツリー構造を操作する上で重要な役割を果たします。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$namespaceURI = 'http://www.example.com/namespace';
4$qualifiedName = 'prefix:elementName';
5$node = $dom->createElementNS($namespaceURI, $qualifiedName);
6
7echo $node->nodeName;
8?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

DOMNameSpaceNode の nodeName プロパティは、名前空間ノードの名前を表す文字列を返します。

サンプルコード

PHP DOMDocument nodeName 取得

1<?php
2
3/**
4 * DOMNameSpaceNode の nodeName プロパティの使用例を示します。
5 *
6 * DOMNameSpaceNode は、XMLドキュメント内の名前空間宣言を表すノードです。
7 * このノードの nodeName プロパティは、名前空間のプレフィックスを返します。
8 *
9 * @return void
10 */
11function demonstrateDomNameSpaceNodeName(): void
12{
13    // XMLデータを作成します。このXMLには名前空間定義が含まれています。
14    // xmlns:myns="http://example.com/mynamespace" が名前空間宣言です。
15    $xmlString = <<<XML
16<root xmlns:myns="http://example.com/mynamespace">
17    <myns:element>This is an element in a namespace.</myns:element>
18</root>
19XML;
20
21    // DOMDocument オブジェクトを作成し、XML文字列を読み込みます。
22    // DOMDocument はXMLドキュメント全体を表現するオブジェクトです。
23    $dom = new DOMDocument();
24    $dom->loadXML($xmlString);
25
26    // DOMXPath オブジェクトを作成し、XMLドキュメントをXPathクエリで検索できるようにします。
27    // XPath はXMLドキュメント内のノードを選択するための言語です。
28    $xpath = new DOMXPath($dom);
29
30    // XPathクエリを使用して、'myns' というプレフィックスを持つ名前空間ノードを選択します。
31    // 'namespace::myns' は、指定された名前空間プレフィックスに対応する名前空間ノードを選択します。
32    // このクエリは、<root> 要素に定義されている名前空間 'myns' のノードを探します。
33    $namespaceNodes = $xpath->query('//root/namespace::myns');
34
35    // 検索結果が空でないことを確認します。
36    if ($namespaceNodes->length > 0) {
37        // 最初の名前空間ノードを取得します。
38        // このノードは DOMNameSpaceNode のインスタンスです。
39        $namespaceNode = $namespaceNodes->item(0);
40
41        // nodeName プロパティは、DOMNameSpaceNode の場合、
42        // その名前空間のプレフィックス(この例では "myns")を返します。
43        echo "名前空間ノードの nodeName: " . $namespaceNode->nodeName . "\n";
44        echo "期待される nodeName (プレフィックス): myns\n";
45    } else {
46        echo "指定された名前空間ノードが見つかりませんでした。\n";
47    }
48}
49
50// 上記の関数を実行して、DOMNameSpaceNode の nodeName プロパティの動作を確認します。
51demonstrateDomNameSpaceNodeName();

PHP 8におけるDOMNameSpaceNode::nodeNameプロパティは、XMLドキュメント内の名前空間宣言を表すノードから、その名前空間のプレフィックスを取得するために使用されます。DOMNameSpaceNodeは、例えばXML要素に記述されるxmlns:prefix="uri"のような名前空間定義そのものを表すオブジェクトです。このnodeNameプロパティは引数を取らず、名前空間のプレフィックスを文字列として返します。

提供されたサンプルコードでは、まず名前空間が定義されたXML文字列を用意し、DOMDocumentに読み込んでいます。次にDOMXPathを使って、//root/namespace::mynsというXPathクエリにより、XMLドキュメント内のmynsというプレフィックスを持つ名前空間ノードを特定しています。このクエリによって、<root xmlns:myns="http://example.com/mynamespace">で定義されたmynsの名前空間宣言がDOMNameSpaceNodeとして取得されます。

取得したDOMNameSpaceNodeオブジェクト(変数$namespaceNode)のnodeNameプロパティにアクセスすると、この名前空間のプレフィックスである「myns」という文字列が得られます。このように、DOMNameSpaceNode::nodeNameプロパティは、XMLの名前空間の識別子として使われるプレフィックスを簡潔に取得したい場合に非常に役立ちます。

DOMNameSpaceNodenodeNameプロパティは、通常のXML要素のnodeNameとは異なり、名前空間宣言で定義された「プレフィックス」を文字列として返します。名前空間のURIそのものが返されるわけではない点にご注意ください。対象の名前空間ノードは、DOMXPathを利用してnamespace::プレフィックスのようなクエリで検索すると効率的です。しかし、クエリの結果、目的のノードが見つからない可能性もあるため、プロパティにアクセスする前に必ずノードの存在(lengthプロパティ)を確認し、エラーを避けるようにしましょう。この機能を利用するには、PHPのDOM拡張が有効になっている必要があります。

PHP DOM: nodeNameで名前空間名を取得する

1<?php
2
3/**
4 * DOMNameSpaceNode::nodeName プロパティの使用例を示します。
5 *
6 * この関数は、XML ドキュメントをパースし、DOMXPath を使用して名前空間ノードを検索します。
7 * 見つかった各 DOMNameSpaceNode オブジェクトから nodeName プロパティを取得し、
8 * その値を表示することで、名前空間のプレフィックス(またはデフォルト名前空間の 'xmlns')
9 * がどのように取得できるかを示します。
10 */
11function demonstrateDomNamespaceNodeName(): void
12{
13    // 名前空間宣言を含むXML文字列を準備します。
14    // 'xmlns:ns1' (プレフィックス付き名前空間) と
15    // 'xmlns' (デフォルト名前空間) が含まれています。
16    $xmlString = <<<XML
17<root xmlns:ns1="http://example.com/ns1-uri" xmlns="http://example.com/default-uri">
18    <ns1:childElement attr="value"/>
19    <anotherElement xmlns:ns2="http://example.com/ns2-uri"/>
20</root>
21XML;
22
23    // DOMDocument オブジェクトを初期化し、XML をロードします。
24    $dom = new DOMDocument();
25    $dom->loadXML($xmlString);
26
27    // DOMXPath オブジェクトを作成し、XPath クエリを使用して名前空間ノードを検索します。
28    // 'namespace::*' は、指定された要素のスコープ内で定義されている
29    // すべての名前空間ノード (DOMNameSpaceNode) を選択します。
30    $xpath = new DOMXPath($dom);
31    $namespaceNodes = $xpath->query('//namespace::*');
32
33    if ($namespaceNodes->length > 0) {
34        echo "DOMNameSpaceNode::nodeName プロパティの出力例:\n\n";
35        foreach ($namespaceNodes as $node) {
36            // $node は DOMNameSpaceNode のインスタンスです。
37            // DOMNameSpaceNode::nodeName は、名前空間のプレフィックスを文字列で返します。
38            // デフォルト名前空間の場合は "xmlns" を返します。
39            echo "ノードタイプ: " . $node->nodeType . " (DOMNode::NAMESPACE_NODE)\n";
40            echo "ノード名 (nodeName): " . $node->nodeName . "\n";
41            echo "ノード値 (nodeValue): " . $node->nodeValue . " (これは名前空間URIです)\n";
42            echo "--------------------\n";
43        }
44    } else {
45        echo "XML内に名前空間ノードが見つかりませんでした。\n";
46    }
47}
48
49// サンプル関数を実行します。
50demonstrateDomNamespaceNodeName();
51

PHPのDOMNameSpaceNode::nodeNameプロパティは、XMLドキュメント内の名前空間ノードの「名前」を取得するために使用されます。このプロパティはDOMNameSpaceNodeクラスに属し、引数を取らずに名前空間のプレフィックス名を文字列として返します。

具体的には、XMLでxmlns:prefix="URI"のように定義された名前空間ノードの場合、nodeNameプロパティは"prefix"という文字列を返します。また、xmlns="URI"のようにプレフィックスが指定されていないデフォルト名前空間ノードの場合は、特別な文字列"xmlns"を返します。これにより、XMLドキュメントに含まれる名前空間が、プレフィックス付きであるか、あるいはデフォルト名前空間であるかを区別して識別することが可能です。

本サンプルコードでは、DOMDocumentDOMXPathを利用してXML文字列から名前空間ノードを抽出し、それぞれのDOMNameSpaceNodeオブジェクトのnodeNameプロパティの値を出力しています。これにより、XMLの構造から名前空間のプレフィックス情報をプログラムで効率的に取得し、その後のデータ処理に役立てる方法を示しています。このプロパティの戻り値は常に文字列型(string)となります。

このコードは、DOMNameSpaceNodeのnodeNameプロパティが名前空間の「プレフィックス」を返す点に注意が必要です。例えば、xmlns:ns1の名前空間からはns1、デフォルト名前空間のxmlnsからはxmlnsという文字列が取得されます。名前空間が指し示すURIはnodeValueプロパティで取得できますので、両者を混同しないよう注意してください。

DOMNameSpaceNodeは、XPathのnamespace::*のような特別なクエリで取得される特殊なノードであり、通常の要素ノードや属性ノードとは扱いが異なります。XMLドキュメントに名前空間が定義されていない場合やXMLの形式が不正な場合は、XPathのクエリ結果が空になることがあります。そのため、必ずlengthプロパティでノードの有無を確認してから処理を行うようにしてください。これにより、安全にコードを利用できます。

関連コンテンツ

関連プログラミング言語

【PHP8.x】nodeNameプロパティの使い方 | いっしー@Webエンジニア