《PHP8上級試験対策》DOMElement::getElementsByTagName()でタグ名から要素を取得する

  • URLをコピーしました!

はじめに

XMLドキュメントから特定のタグを取得するときに使うのが DOMElement::getElementsByTagName()
PHP8 上級試験では「DOM操作」も頻出分野のひとつで、戻り値の型や取得対象の範囲(子孫ノードまで含まれるか)を正しく理解しておくことがポイントです。

キーワード: DOMElement / DOMNodeList / getElementsByTagName / XMLパース / PHP8上級試験対策

目次

DOMElement::getElementsByTagName()とは?

DOMElement::getElementsByTagName() は、指定したタグ名を持つ要素を、すべてDOMNodeListとして返す メソッドです。
ドキュメント全体から検索できるほか、特定の要素から呼び出せば、その要素の「子孫ノード」も対象になります。

public DOMElement::getElementsByTagName(string $qualifiedName): DOMNodeList

戻り値の DOMNodeList は、配列のように扱えるオブジェクトです。
foreach でループでき、item(index) で特定要素を取り出すことも可能です。

サンプルコードと実行結果

次のコードは、book 要素をすべて取得し、その中の titleauthor を順に出力する例です。

<?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 全体と、要素単体の呼び出しの違いを整理しておきましょう。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次