Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】XMLReader::XML()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

XMLメソッドは、提供されたXML文字列を読み込み、XMLReaderオブジェクトを初期化してXMLデータの解析準備を行うメソッドです。このメソッドを利用することで、ファイルシステム上のXMLファイルを読み込むopenメソッドとは異なり、メモリ上に存在するXMLデータを直接処理できるようになります。例えば、データベースから取得したXMLデータや、プログラム内で動的に生成されたXML文字列を解析したい場合に非常に役立ちます。

具体的には、XMLReaderオブジェクトのインスタンスを生成した後、このXMLメソッドに解析したいXML文字列を引数として渡します。これにより、XMLReaderは渡された文字列をXMLデータとして認識し、その後readメソッドなどを使ってXMLノードを順番に読み進めることが可能になります。ファイルI/Oを伴わないため、システムリソースの消費を抑えつつ、柔軟なXML処理を実現できます。XMLReaderが提供するストリームベースの解析機能と組み合わせることで、大規模なXMLデータでも効率的に、かつ低メモリで処理することができる基盤を整える重要なメソッドです。

構文(syntax)

1<?php
2
3$reader = new XMLReader();
4$xmlString = '<root><item>example</item></root>';
5$reader->XML($xmlString);
6
7?>

引数(parameters)

string $source, ?string $encoding = null, int $flags = 0

  • string $source: XMLデータを読み込むためのソースを指定します。ファイルパス、URL、またはXML文字列を指定できます。
  • ?string $encoding = null: XMLソースのエンコーディングを指定します。指定しない場合、XML宣言で指定されたエンコーディングが使用されます。
  • int $flags = 0: XMLReaderの動作を制御するためのフラグを指定します。例えば、XMLREADER::LOADDTD を指定するとDTDのロードも有効になります。

戻り値(return)

bool

XMLReader::XML() メソッドは、XMLReader オブジェクトを初期化します。 XMLReader::XML() メソッドは、初期化が成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHP XMLReader XMLパース

1<?php
2
3/**
4 * XMLReader::XML メソッドを使用してXML文字列をパースする関数です。
5 * システムエンジニアを目指す初心者にも分かりやすいように、
6 * XMLの読み込みと各ノードの情報の取得方法を示します。
7 *
8 * @param string $xmlString パースするXML文字列。
9 * @return void
10 */
11function parseXmlStringWithXmlReader(string $xmlString): void
12{
13    // XMLReader オブジェクトを新しく作成します。
14    // このオブジェクトを使ってXMLデータを読み込みます。
15    $reader = new XMLReader();
16
17    // XML文字列を直接読み込みます。
18    // 成功した場合は true、失敗した場合は false を返します。
19    if (!$reader->XML($xmlString)) {
20        echo "エラー: XML文字列の読み込みに失敗しました。\n";
21        echo "指定されたXMLが正しくないか、エンコーディングに問題がある可能性があります。\n";
22        return;
23    }
24
25    echo "XMLパースを開始します。\n";
26    echo "--------------------------------------------------\n";
27
28    // read() メソッドは、XML内の次のノードに進みます。
29    // ノードがなくなるまでループを続けます。
30    while ($reader->read()) {
31        // 各ノードの情報を取得し表示します。
32        // nodeType はノードの種類を示します(例: 要素、テキスト、属性など)。
33        // name はノードの名前です(例: <book>要素なら 'book')。
34        echo "ノードタイプ: " . $reader->nodeType;
35        echo ", 名前: " . ($reader->name ?: '[匿名]'); // 名前がないノードもあります (例: テキストノード)
36
37        // ノードが要素 (例: <book> や <title>) の場合
38        if ($reader->nodeType === XMLReader::ELEMENT) {
39            echo " (要素)";
40            // 要素が属性を持っている場合
41            if ($reader->hasAttributes) {
42                echo ", 属性: ";
43                // 属性を一つずつ移動して表示します。
44                while ($reader->moveToNextAttribute()) {
45                    echo "{$reader->name}=\"{$reader->value}\" ";
46                }
47                // 属性の読み込みが終わったら、元の要素に戻ります。
48                $reader->moveToElement();
49            }
50        } elseif ($reader->nodeType === XMLReader::TEXT || $reader->nodeType === XMLReader::CDATA) {
51            // ノードがテキストまたはCDATAセクションの場合、その値も表示します。
52            echo ", 値: " . $reader->value;
53        }
54
55        echo "\n";
56    }
57
58    echo "--------------------------------------------------\n";
59    // XMLReader を閉じて、関連するリソースを解放します。
60    $reader->close();
61    echo "XMLパースが完了しました。\n";
62}
63
64// サンプルとして使用するXML文字列を定義します。
65$sampleXml = <<<XML
66<?xml version="1.0" encoding="UTF-8"?>
67<library>
68    <book id="B001" genre="fiction">
69        <title>PHPプログラミング入門</title>
70        <author>山田 太郎</author>
71        <price currency="JPY">2980</price>
72        <description><![CDATA[この本は<b>PHP 8</b>の基本から応用までを丁寧に解説しています。]]></description>
73    </book>
74    <book id="B002" genre="tech" available="true">
75        <title>XMLデータ解析の基礎</title>
76        <author>鈴木 花子</author>
77        <price currency="USD">25.00</price>
78    </book>
79</library>
80XML;
81
82// 定義した関数を呼び出し、XML文字列をパースします。
83parseXmlStringWithXmlReader($sampleXml);
84
85echo "\n--- 不正なXML文字列の例 ---\n";
86// 不正なXML文字列を渡した場合の動作確認
87$invalidXml = <<<XML
88<root>
89    <item>値1</item>
90    <item>値2
91</root> <!-- 閉じタグが不足しています -->
92XML;
93parseXmlStringWithXmlReader($invalidXml);

XMLReader::XMLメソッドは、PHPでXML形式の文字列を効率的に読み込み、解析するために使用されるXMLReaderクラスの重要なメソッドです。このメソッドは、引数$sourceに指定されたXML文字列を直接受け取り、解析の準備を行います。オプションでエンコーディングやフラグも指定できます。

メソッドの戻り値はbool型で、XML文字列の読み込みと初期化に成功した場合はtrueを、XML形式に誤りがあるなど失敗した場合はfalseを返します。これにより、渡されたXMLデータが有効であるかを簡単に判断し、エラー処理を行うことができます。

サンプルコードでは、まずXMLReaderオブジェクトを新しく作成し、そのXMLメソッドに用意したXML文字列を渡して読み込みを開始します。読み込みが成功すると、while ($reader->read())のループを使ってXML内のノードを一つずつ順に処理していきます。各ノードの種類(nodeType)や名前(name)、値(value)を取得し、要素が持つ属性もmoveToNextAttribute()メソッドで丁寧に抽出する方法が示されています。処理の最後にはclose()メソッドでリソースを解放します。このコードを通じて、XML文字列の読み込みから構造の巡回、詳細情報の取得までの一連のパース処理を学ぶことができます。

XMLReader::XMLメソッドは、XML文字列の読み込みに失敗するとfalseを返すため、必ず戻り値を確認しエラー処理をしてください。XMLのパースはread()メソッドでノードを順次処理し、nodeTypeなどでノードの種類を判断して情報を取得します。特に要素の属性はmoveToNextAttribute()でアクセスし、処理後はmoveToElement()で必ず元の要素に戻る操作が必要です。また、処理終了後はclose()メソッドを呼び出し、関連するリソースを適切に解放することを忘れないでください。

PHP XMLReaderでXML文字列を読み込む

1<?php
2
3/**
4 * XMLReader::XML() メソッドを使用してXML文字列からデータを読み込むサンプル関数です。
5 *
6 * この関数は、指定されたXMLコンテンツ文字列を受け取り、
7 * XMLReader を用いてその内容をノード単位で解析し、各ノードの情報を出力します。
8 * XMLReader::XML() は、ファイルパスではなく、直接PHPスクリプト内のXML文字列を処理する際に使用します。
9 *
10 * @param string $xmlSource 解析するXMLコンテンツを含む文字列。
11 * @return bool XMLの読み込みと解析が成功した場合は true、失敗した場合は false。
12 */
13function processXmlString(string $xmlSource): bool
14{
15    // XMLReader オブジェクトを新しく作成します。
16    // これは、XML文書をストリームとして読み込むための軽量なパーサーです。
17    $reader = new XMLReader();
18
19    // XMLReader::XML() メソッドを使用して、提供されたXML文字列からリーダーを開きます。
20    // このメソッドが成功すると、リーダーはXML文書の最初のノードに位置付けられます。
21    // 第2引数、第3引数はオプションで、エンコーディングやフラグを指定できますが、
22    // ここではデフォルト値を使用します。
23    if (!$reader->XML($xmlSource)) {
24        echo "エラー: 指定されたXML文字列を読み込み用に開くことができませんでした。\n";
25        return false;
26    }
27
28    echo "XML文字列の解析を開始します。\n";
29
30    // XML文書をノードごとに読み進めます。
31    // $reader->read() は、次のノードに移動し、文書の終わりに達すると false を返します。
32    while ($reader->read()) {
33        // 現在のノードのタイプをチェックし、それに応じた処理を行います。
34        switch ($reader->nodeType) {
35            case XMLReader::ELEMENT: // 要素ノード(例: <book>)の場合
36                echo "要素: " . $reader->name;
37                // 要素が属性を持っている場合、その数も表示します。
38                if ($reader->hasAttributes) {
39                    echo " (属性数: " . $reader->attributeCount . ")";
40                }
41                echo "\n";
42                break;
43
44            case XMLReader::TEXT: // テキストノード(例: <title>タイトル</title> の「タイトル」)の場合
45                // 空白のみのテキストノードは、通常は意味がないためスキップします。
46                $trimmedValue = trim($reader->value);
47                if (!empty($trimmedValue)) {
48                    echo "  テキスト: " . $trimmedValue . "\n";
49                }
50                break;
51
52            // コメント、DOCTYPE、属性などの他のノードタイプも処理できますが、
53            // 初心者向けに主要な要素とテキストに絞って表示しています。
54        }
55    }
56
57    // XML文書の読み込みが完了したら、リーダーを閉じます。
58    // これにより、使用していたリソースが解放されます。
59    $reader->close();
60
61    echo "XML文字列の解析が完了しました。\n";
62    return true;
63}
64
65// 解析対象となるサンプルXML文字列を定義します。
66$sampleXmlContent = <<<XML
67<bookstore>
68    <book category="cooking">
69        <title lang="en">Everyday Italian</title>
70        <author>Giada De Laurentiis</author>
71        <year>2005</year>
72        <price>30.00</price>
73    </book>
74    <book category="children">
75        <title lang="en">Harry Potter</title>
76        <author>J.K. Rowling</author>
77        <year>2005</year>
78        <price>29.99</price>
79    </book>
80</bookstore>
81XML;
82
83// 定義したXML文字列を処理する関数を呼び出します。
84echo "--- 有効なXMLの処理 ---\n";
85processXmlString($sampleXmlContent);
86
87// 不正なXML文字列を渡した場合の例
88$invalidXmlContent = "<root><item>テキスト</error>"; // 閉じタグが不正
89echo "\n--- 不正なXMLの処理 (エラー発生例) ---\n";
90processXmlString($invalidXmlContent);
91
92?>

PHPのXMLReader::XML()メソッドは、XML文書をファイルからではなく、PHPスクリプト内のXML文字列から直接読み込むための機能を提供します。このメソッドは、解析したいXMLコンテンツを含む文字列を最初の引数$sourceとして受け取ります。オプションとして、XMLのエンコーディングを$encoding引数で、またXML処理に関する追加の挙動を$flags引数で指定することも可能です。メソッドがXML文字列の読み込みに成功するとtrueを返し、XMLReaderオブジェクトは文書の最初のノードに位置付けられます。読み込みに失敗した場合はfalseを返します。

サンプルコードでは、まずXMLReaderの新しいインスタンスを作成し、XML()メソッドを使って定義済みのXML文字列を読み込み用に開いています。その後、read()メソッドを繰り返し呼び出してXML文書のノードを一つずつ順次読み進め、各ノードのタイプ(要素やテキストなど)に応じてその情報(名前、テキスト値、属性数など)を出力しています。これは、大規模なXMLデータでもメモリを効率的に利用できるストリーム方式の解析方法です。すべてのノードの読み込みが完了したら、close()メソッドを呼び出して使用していたリソースを解放します。これにより、有効なXMLと不正なXMLの両方に対して、XMLReaderによる効率的な解析プロセスとその結果を初心者の方にもわかりやすく示しています。

XMLReader::XML()メソッドは、ファイルパスではなく、PHPスクリプト内のXML文字列を直接解析する際に利用します。これは大規模なXMLコンテンツを扱う際にメモリ使用量を抑えられるストリームパーサーであり、XML全体をメモリに読み込むDOMパーサーとの使い分けが重要です。XMLの読み込みは順方向にのみ可能で、一度読み進んだノードに戻ることはできません。不正なXML文字列を渡すとエラーとなるため、必ず戻り値を確認し適切なエラー処理を実装してください。処理が完了したら$reader->close()を呼び出し、使用したリソースを解放することを忘れないでください。

関連コンテンツ