【PHP8.x】getElementsByTagNameメソッドの使い方

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

作成日: 更新日:

基本的な使い方

getElementsByTagNameメソッドは、Dom\XMLDocumentクラスに属するメソッドであり、指定されたタグ名を持つすべての要素を含むNodeListを返します。このメソッドは、XMLドキュメント全体から特定の種類の要素を効率的に検索するために使用されます。

具体的には、getElementsByTagNameメソッドは、引数としてタグ名を文字列で受け取ります。そして、ドキュメントツリーを検索し、そのタグ名に一致するすべての要素を見つけ出します。見つかった要素は、NodeListオブジェクトとして返されます。NodeListは、要素の順序付きコレクションであり、インデックスを使用して個々の要素にアクセスできます。

例えば、<book>タグを持つすべての要素を取得したい場合、$dom->getElementsByTagName('book')のように記述します。これにより、ドキュメント内のすべての<book>要素がNodeListとして返されます。NodeListが空の場合、つまり、指定されたタグ名を持つ要素が見つからなかった場合は、空のNodeListが返されます。

このメソッドは、XMLドキュメントの構造を解析し、特定の要素を操作する際に非常に役立ちます。システムエンジニアがXMLデータを扱うアプリケーションを開発する際、このメソッドを活用することで、データの抽出、更新、削除などの処理を効率的に行うことができます。getElementsByTagNameメソッドは、DOM (Document Object Model) を利用したXML処理において、基本的ながらも重要な役割を果たすメソッドと言えるでしょう。

構文(syntax)

1<?php
2
3namespace Dom;
4
5class XMLDocument
6{
7    public function getElementsByTagName(string $tagName): \DOMNodeList
8    {
9        // メソッドの実装
10    }
11}

引数(parameters)

string $qualifiedName

  • string $qualifiedName: 検索したい要素のタグ名を指定する文字列

戻り値(return)

Dom\NodeList

指定されたタグ名を持つすべての要素を、文書ツリーの深さ優先順序で並べた Dom\NodeList オブジェクトとして返します。

サンプルコード

PHPで複数のXMLタグを検索する

1<?php
2
3/**
4 * XMLドキュメントから指定された複数のタグ名の要素を検索し、その内容を表示します。
5 *
6 * Dom\XMLDocument::getElementsByTagName() メソッドは単一のタグ名しか受け取らないため、
7 * 複数の異なるタグ名を持つ要素を検索する場合は、このメソッドを繰り返し呼び出す必要があります。
8 *
9 * @param string $xmlString 検索対象となるXML文字列。
10 * @param array<string> $tagNames 検索したいタグ名の配列。
11 * @return void
12 */
13function findAndDisplayMultipleTags(string $xmlString, array $tagNames): void
14{
15    // Dom\XMLDocument オブジェクトを作成します。
16    // PHP 8 の Dom 拡張は Dom\XMLDocument を使用します。
17    $document = new Dom\XMLDocument();
18
19    // XMLコンテンツをロードします。失敗した場合はエラーメッセージを表示して終了します。
20    if (!$document->loadXML($xmlString)) {
21        echo "エラー: XMLのロードに失敗しました。\n";
22        return;
23    }
24
25    echo "--- XMLドキュメントから複数のタグを検索しています ---\n";
26
27    // 指定された各タグ名に対して処理を行います。
28    foreach ($tagNames as $tagName) {
29        echo "\n### タグ名: <{$tagName}> の要素 ###\n";
30
31        // Dom\XMLDocument::getElementsByTagName() メソッドを使用して、
32        // 指定された単一のタグ名を持つすべての要素を取得します。
33        // 戻り値はDom\NodeListオブジェクトです。
34        $elements = $document->getElementsByTagName($tagName);
35
36        // 取得した要素のリストをループし、そのテキスト内容を表示します。
37        if ($elements->count() > 0) {
38            foreach ($elements as $index => $element) {
39                // Dom\Element クラスは Dom\Node を継承しており、
40                // textContent プロパティでノードのテキストコンテンツにアクセスできます。
41                echo "  [{$index}] {$tagName}: " . $element->textContent . "\n";
42            }
43        } else {
44            echo "  <{$tagName}> 要素は見つかりませんでした。\n";
45        }
46    }
47    echo "\n--- 検索終了 ---\n";
48}
49
50// サンプルXML文字列を定義します。
51$sampleXml = <<<XML
52<?xml version="1.0" encoding="UTF-8"?>
53<root>
54    <item id="1">
55        <name>Apple</name>
56        <price>1.00</price>
57        <description>A sweet red fruit.</description>
58    </item>
59    <item id="2">
60        <name>Banana</name>
61        <price>0.50</price>
62        <description>A yellow tropical fruit.</description>
63    </item>
64    <product>
65        <title>Laptop</title>
66        <sku>LT-2023</sku>
67    </product>
68    <item id="3">
69        <name>Orange</name>
70        <price>0.75</price>
71    </item>
72    <details>
73        <info>Additional information here.</info>
74    </details>
75</root>
76XML;
77
78// 検索したい複数のタグ名を配列で指定します。
79// 存在しないタグ名も指定して、その場合の挙動も確認できます。
80$tagsToFind = ['name', 'price', 'product', 'info', 'nonExistentTag'];
81
82// 関数を呼び出して、XMLドキュメントから複数のタグの要素を検索し、結果を表示します。
83findAndDisplayMultipleTags($sampleXml, $tagsToFind);

PHP 8では、XMLドキュメントを操作する際にDom\XMLDocumentクラスを使用します。このクラスのgetElementsByTagNameメソッドは、XMLドキュメント内から特定のタグ名を持つすべての要素を検索する機能を提供します。このメソッドは、検索したい単一のタグ名(string $qualifiedName)を引数として受け取り、戻り値として見つかった要素のリスト(Dom\NodeList)を返します。

提供されたサンプルコードは、getElementsByTagNameメソッドが一度に複数のタグ名を指定できないため、複数の異なるタグ名の要素を効率的に検索し表示する方法を示しています。具体的には、検索したいタグ名の配列をループで処理し、各タグ名に対してgetElementsByTagNameメソッドを繰り返し呼び出しています。これにより、読み込まれたXML文字列から指定された各タグ名の要素を個別に抽出し、そのテキスト内容を$element->textContentプロパティで取得して表示します。要素が見つからなかった場合でも、その状況を明確に示し、システムエンジニアを目指す方にも処理の流れが分かりやすいよう設計されています。

このサンプルコードは、PHPのDom\XMLDocument::getElementsByTagName()メソッドが単一のタグ名しか受け取らない点に注目しています。複数の異なるタグ名を持つ要素を検索したい場合は、引数に各タグ名を指定してこのメソッドを繰り返し呼び出す必要があります。取得した結果はDom\NodeListとして返されるため、foreachループでこのリストを反復処理し、各要素のtextContentプロパティを使って内容を取り出します。また、$document->loadXML()が失敗する可能性も考慮し、エラー処理を行うことが重要です。これにより、目的のXML情報を効率的かつ安全に抽出できます。

PHP: getElementsByTagName でXML要素を検索する

1<?php
2
3/**
4 * Dom\XMLDocument::getElementsByTagName メソッドの使用例をデモンストレーションします。
5 *
6 * この関数は、XML ドキュメントから特定のタグ名を持つ要素を検索する方法を示します。
7 * キーワード 'php getelementsbytagnamens' に関連して、名前空間プレフィックスを含むタグの
8 * 検索方法も示しますが、これは名前空間 URI による検索ではない点に注意が必要です。
9 * システムエンジニアを目指す初心者向けに、正確で簡潔なサンプルコードを提供します。
10 */
11function demonstrateGetElementsByTagNameUsage(): void
12{
13    // 検索対象となる XML 文字列を定義します。
14    // <contact:info> 要素は、名前空間プレフィックスを持つタグの例です。
15    $xmlString = <<<XML
16<?xml version="1.0" encoding="UTF-8"?>
17<library>
18    <book id="1">
19        <title>PHP Basics</title>
20        <author>John Doe</author>
21    </book>
22    <book id="2">
23        <title>Advanced PHP</title>
24        <author>Jane Smith</author>
25    </book>
26    <contact:info xmlns:contact="http://example.com/contact">
27        <contact:email>info@example.com</contact:email>
28        <contact:phone>+1-123-456-7890</contact:phone>
29    </contact:info>
30</library>
31XML;
32
33    // Dom\XMLDocument オブジェクトを新しく作成します。
34    // PHP 8 では Dom\XMLDocument が推奨される型ヒントですが、
35    // 内部的には DOMDocument クラスが使用されます。
36    $document = new Dom\XMLDocument();
37
38    // XML 文字列を解析してドキュメントに読み込みます。
39    // 読み込みに失敗した場合はエラーメッセージを出力し、処理を終了します。
40    if (!$document->loadXML($xmlString)) {
41        echo "エラー: XML 文字列の読み込みに失敗しました。" . PHP_EOL;
42        return;
43    }
44
45    echo "--- 'book' タグを検索 ---" . PHP_EOL;
46    // 'book' というタグ名を持つすべての要素を取得します。
47    // 戻り値は Dom\NodeList オブジェクトです。
48    $books = $document->getElementsByTagName('book');
49
50    if ($books->length === 0) {
51        echo "  'book' 要素は見つかりませんでした。" . PHP_EOL;
52    } else {
53        foreach ($books as $book) {
54            // 各 'book' 要素から 'title' と 'author' の子要素を取得します。
55            // item(0) で最初の要素を取得し、存在しない場合は null となります。
56            $titleNode = $book->getElementsByTagName('title')->item(0);
57            $authorNode = $book->getElementsByTagName('author')->item(0);
58
59            $title = $titleNode ? $titleNode->nodeValue : '不明なタイトル';
60            $author = $authorNode ? $authorNode->nodeValue : '不明な著者';
61
62            echo "  書籍ID: " . $book->getAttribute('id') . PHP_EOL;
63            echo "    タイトル: " . $title . PHP_EOL;
64            echo "    著者: " . $author . PHP_EOL;
65        }
66    }
67    echo PHP_EOL;
68
69    echo "--- 'contact:email' タグを検索 ---" . PHP_EOL;
70    // 名前空間プレフィックス 'contact:' を含む 'email' タグを検索します。
71    // getElementsByTagName メソッドは、指定された文字列と完全に一致するタグ名を検索します。
72    // これは名前空間 URI ('http://example.com/contact') による検索ではなく、
73    // 'contact:email' という文字列そのものによる検索である点に注意してください。
74    // 名前空間 URI を指定して検索する場合は、getElementsByTagNameNS メソッドを使用します。
75    $contactEmails = $document->getElementsByTagName('contact:email');
76
77    if ($contactEmails->length === 0) {
78        echo "  'contact:email' 要素は見つかりませんでした。" . PHP_EOL;
79    } else {
80        foreach ($contactEmails as $emailElement) {
81            echo "  連絡先メールアドレス: " . $emailElement->nodeValue . PHP_EOL;
82        }
83    }
84    echo PHP_EOL;
85}
86
87// 関数を実行してデモンストレーションを開始します。
88demonstrateGetElementsByTagNameUsage();
89

Dom\XMLDocument::getElementsByTagNameメソッドは、XMLドキュメント内から指定したタグ名を持つすべての要素を取得するために使用されます。引数$qualifiedNameには検索したいタグ名を文字列で渡します。このメソッドは、見つかった要素の集合をDom\NodeListオブジェクトとして返します。要素が見つからない場合は、空のDom\NodeListが返されます。

サンプルコードでは、まず定義されたXML文字列をDom\XMLDocumentオブジェクトに読み込みます。その後、'book'タグを持つ要素を検索し、それぞれの書籍ID、タイトル、著者情報を取得して表示します。

次に、'contact:email'という名前空間プレフィックス付きのタグを検索する例を示しています。ここで重要なのは、getElementsByTagNameメソッドは「contact:email」という文字列と完全に一致するタグ名を検索するという点です。これは、特定の名前空間URIに属する要素を検索するものではありません。もし名前空間URIを指定して要素を検索したい場合は、getElementsByTagNameNSメソッドを使用する必要があります。このように、getElementsByTagNameを使うことで、初心者でもXMLドキュメント内の特定要素を効率的に見つけることができます。

Dom\XMLDocument::getElementsByTagNameメソッドは、XML要素の完全なタグ名文字列で検索します。名前空間プレフィックスを含むタグ(例: contact:email)も、その文字列全体を指定する必要があります。名前空間URIを指定して要素を検索したい場合は、getElementsByTagNameNSメソッドを使用しますので、この違いにご注意ください。メソッドの戻り値はDom\NodeListオブジェクトで、要素が見つからない場合も空のリストが返ります。そのため、lengthプロパティで要素の有無を確認し、存在しない場合の処理を必ず組み込んでください。また、XMLの読み込み(loadXMLなど)は失敗する可能性があるため、必ず戻り値を確認し、エラーハンドリングを行うことが安全な利用に繋がります。PHP 8ではDom\XMLDocumentが型ヒントで推奨されますが、実体はDOMDocumentクラスです。