はじめに
XMLドキュメントから特定のタグを取得するときに使うのが DOMElement::getElementsByTagName()。
PHP8 上級試験では「DOM操作」も頻出分野のひとつで、戻り値の型や取得対象の範囲(子孫ノードまで含まれるか)を正しく理解しておくことがポイントです。
DOMElement::getElementsByTagName()とは?
DOMElement::getElementsByTagName() は、指定したタグ名を持つ要素を、すべてDOMNodeListとして返す メソッドです。
ドキュメント全体から検索できるほか、特定の要素から呼び出せば、その要素の「子孫ノード」も対象になります。
public DOMElement::getElementsByTagName(string $qualifiedName): DOMNodeList戻り値の DOMNodeList は、配列のように扱えるオブジェクトです。foreach でループでき、item(index) で特定要素を取り出すことも可能です。
サンプルコードと実行結果
次のコードは、book 要素をすべて取得し、その中の title と author を順に出力する例です。
<?php
declare(strict_types=1);
error_reporting(-1);
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book>
<title>PHP8技術者認定初級試験公式問題集</title>
<author>野田貴子</author>
</book>
<book>
<title>PHP8技術者認定上級試験公式問題集</title>
<author>古圧道明</author>
</book>
</books>
XML;
$xobj = new DOMDocument();
$xobj->loadXML($xml);
$books = $xobj->getElementsByTagName('book');
foreach($books as $k => $book){
echo "{$k}\n";
$title = $book->getElementsByTagName('title')->item(0);
var_dump($title->nodeValue);
$author = $book->getElementsByTagName('author')->item(0);
var_dump($author->nodeValue);
}実行結果:
0
string(46) "PHP8技術者認定初級試験公式問題集"
string(12) "野田貴子"
1
string(46) "PHP8技術者認定上級試験公式問題集"
string(12) "古圧道明"実行結果が正しい理由
$xobj->getElementsByTagName('book') はドキュメント全体から <book> タグを2つ取得します。
その後、各 $book からさらに getElementsByTagName('title') と getElementsByTagName('author') を呼ぶことで、その要素の中の子孫ノードを検索します。
つまり、1回目のループでは「初級試験+野田貴子」、2回目では「上級試験+古圧道明」が正しく抽出されます。
DOMツリー構造で理解する
DOMDocument
└── <books>
├── <book> (0)
│ ├── <title>PHP8技術者認定初級試験公式問題集</title>
│ └── <author>野田貴子</author>
└── <book> (1)
├── <title>PHP8技術者認定上級試験公式問題集</title>
└── <author>古圧道明</author>各 <book> から getElementsByTagName() を呼ぶと、その「内側(子孫)」にあるタグが対象になります。
直下だけを取りたい場合は、XPathなどを使うのが便利です。
まとめ
| 項目 | 内容 |
|---|---|
| メソッド | DOMElement::getElementsByTagName(string $qualifiedName) |
| 戻り値 | DOMNodeList(IteratorAggregate, Countableを実装) |
| 検索範囲 | 子孫ノードすべてが対象 |
| 典型的用途 | XML内の同名タグをまとめて取得する |
| 実行結果 | 今回の出力は「正しい」 |
🪶ポイント:DOMElement::getElementsByTagName() は「要素ごとに呼べる」という点が試験でも問われやすいです。DOMDocument 全体と、要素単体の呼び出しの違いを整理しておきましょう。
