XMLデータを処理する場合、PHPはいくつかの強力なツールを提供します。その1つは、PHPのXMLパーサー(Expatに基づく)に属するXML_PARSE()関数です。この記事では、この関数を使用してXMLファイルを解析し、属性値とテキストコンテンツを抽出する方法を紹介します。
sample.xmlという名前の次のXMLファイルがあるとします。
<?xml version="1.0" encoding="UTF-8"?>
<articles>
<article id="101" author="Alice">
<title>PHP XML分析チュートリアル</title>
<url>https://m66.net/articles/php-xml</url>
</article>
<article id="102" author="Bob">
<title>詳細な理解DOMDocument</title>
<url>https://m66.net/articles/domdocument</url>
</article>
</articles>
私たちの目標は、 ID 、著者の属性、および各記事のタイトルとリンクを解析することです。
XML_PARSE()は、低レベルのXML解析機能です。それを使用する場合、 XML_SET_ELEMENT_HANDLER()とXML_SET_CHARACTER_DATA_HANDLER()を組み合わせる必要があります。
<?php
$xml = file_get_contents('sample.xml');
$parser = xml_parser_create("UTF-8");
// 現在の要素名を保存します
$currentTag = '';
// 記事データを保存します
$articles = [];
$currentArticle = [];
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
function startElement($parser, $name, $attrs) {
global $currentTag, $currentArticle, $articles;
$currentTag = strtolower($name);
if ($currentTag === 'article') {
// 新しい記事を初期化します
$currentArticle = [
'id' => $attrs['ID'] ?? '',
'author' => $attrs['AUTHOR'] ?? '',
'title' => '',
'url' => ''
];
}
}
function endElement($parser, $name) {
global $currentTag, $currentArticle, $articles;
if (strtolower($name) === 'article') {
$articles[] = $currentArticle;
}
$currentTag = '';
}
function characterData($parser, $data) {
global $currentTag, $currentArticle;
$data = trim($data);
if (!$data) return;
if ($currentTag === 'title') {
$currentArticle['title'] .= $data;
} elseif ($currentTag === 'url') {
$currentArticle['url'] .= $data;
}
}
// 解析を開始します
if (!xml_parse($parser, $xml, true)) {
die("XML Error: " . xml_error_string(xml_get_error_code($parser)));
}
xml_parser_free($parser);
// 出力分析の結果
foreach ($articles as $article) {
echo "記事 ID: " . $article['id'] . PHP_EOL;
echo "著者: " . $article['author'] . PHP_EOL;
echo "タイトル: " . $article['title'] . PHP_EOL;
echo "リンク: " . $article['url'] . PHP_EOL;
echo str_repeat('-', 40) . PHP_EOL;
}
?>
上記のコードを実行した後、出力は次のとおりです。
記事 ID: 101
著者: Alice
タイトル: PHP XML分析チュートリアル
リンク: https://m66.net/articles/php-xml
----------------------------------------
記事 ID: 102
著者: Bob
タイトル: 詳細な理解DOMDocument
リンク: https://m66.net/articles/domdocument
----------------------------------------
XML_PARSE()は、XMLデータストリームのイベント駆動型処理を提供します。これは、大きなファイルやリアルタイムの解析タスクの処理に非常に適しています。使用中のDOMやSimplexMLほど直感的ではありませんが、非常に解析効率が高く、メモリに敏感なアプリケーションに適しています。
実際の開発では、XMLファイル構造が複雑であるか、柔軟性が必要な場合は、 domdocumentまたはsimplexmlの使用を検討できます。ただし、解析プロセスを慎重に制御する必要がある場合、または極端なパフォーマンス要件が必要な場合、 XML_PARSE()は間違いなく検討する価値のあるツールです。