Web開発を行うときは、サードパーティAPIから取得したデータ応答など、XMLデータを処理するか、特定の構成ファイルを解析する必要があることがよくあります。 PHPでは、 XML_PARSEおよびXML_SET_ELEMENT_HANDLERは、特に大きなファイルの処理やストリーミング解析に適したイベント駆動型のXMLデータを処理する方法を提供します。
この記事では、実用的なケースを使用して、これら2つの機能を使用してXMLコンテンツを解析し、必要なデータを抽出する方法を示します。
simplexml 、 domdocument 、 xmlreaderなどを使用するなど、phpでxmlを処理する方法はたくさんありますが、 xml_parseはイベントベースの解析方法であり、sax(xml for xml for xmlの単純API)パーサーとも呼ばれます。この解析方法は、XML全体をメモリにロードする必要がないため、大量のXMLを処理するのに最適です。
XML_PARSER_CREATE() :XMLパーサーを作成します。
xml_set_element_handler() :開始タグとエンドタグを処理するコールバック関数を設定します。
xml_parse() :xmlの解析を開始します。
xml_parser_free() :パーサーリソースをリリースします。
コンテンツプラットフォームからのXMLデータのような部分があると仮定しましょう。
<?xml version="1.0"?>
<articles>
<article>
<title>PHP XML分析ガイド</title>
<author>リー・レイ</author>
<url>https://m66.net/articles/php-xml-guide</url>
</article>
<article>
<title>詳細な理解 xml_set_element_handler</title>
<author>ハン・メイミー</author>
<url>https://m66.net/articles/xml-handler-deepdive</url>
</article>
</articles>
目標:すべての記事のタイトルとリンクを抽出し、配列に保存します。
<?php
$xmlData = <<<XML
<?xml version="1.0"?>
<articles>
<article>
<title>PHP XML分析ガイド</title>
<author>リー・レイ</author>
<url>https://m66.net/articles/php-xml-guide</url>
</article>
<article>
<title>詳細な理解 xml_set_element_handler</title>
<author>ハン・メイミー</author>
<url>https://m66.net/articles/xml-handler-deepdive</url>
</article>
</articles>
XML;
$parser = xml_parser_create("UTF-8");
$articles = [];
$currentTag = "";
$currentArticle = [];
// Startタグプロセッサを定義します
function startElement($parser, $name, $attrs) {
global $currentTag;
$currentTag = strtolower($name);
}
// エンドタグプロセッサを定義します
function endElement($parser, $name) {
global $currentTag, $currentArticle, $articles;
if (strtolower($name) == 'article') {
$articles[] = $currentArticle;
$currentArticle = [];
}
$currentTag = "";
}
// 文字データプロセッサを定義します
function characterData($parser, $data) {
global $currentTag, $currentArticle;
$data = trim($data);
if ($data === '') return;
if (in_array($currentTag, ['title', 'author', 'url'])) {
$currentArticle[$currentTag] = $data;
}
}
// 処理機能のセットアップ
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// 解析を開始します
if (!xml_parse($parser, $xmlData, true)) {
die(sprintf("XML 間違い: %s で %d わかりました",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
// 出力分析の結果
echo "<pre>";
print_r($articles);
echo "</pre>";
?>
Array
(
[0] => Array
(
[title] => PHP XML分析ガイド
[author] => リー・レイ
[url] => https://m66.net/articles/php-xml-guide
)
[1] => Array
(
[title] => 詳細な理解 xml_set_element_handler
[author] => ハン・メイミー
[url] => https://m66.net/articles/xml-handler-deepdive
)
)
このケースを通じて、 XML_PARSEとXML_SET_ELEMENT_HANDLERが必要に応じてすべてのタグとテキストコンテンツを処理できることがわかります。この方法はSimplexMLよりもわずかに複雑ですが、XMLファイルが非常に大きいか、ネットワークストリームから来ている場合、その利点が現れます。
次のシナリオに適用できます。
大規模XMLファイルのメモリに敏感な処理。
ネットワークストリームのXMLデータをリアルタイムで解析します。
XMLタグのカスタムファインコントロールが必要なシナリオ。
複雑なXML構造に対処する必要があるシステムを構築している場合は、このサックス解析方法を試すことをお勧めします。