PHPでは、dom、simplexml、またはXMLパーサーの使用など、XMLデータを解析する多くの方法があります。この記事では、XMLパーサーと組み合わせて基礎となるXML_PARSE()関数を使用して処理する方法を紹介します。
XML_PARSE()は、PHPのXML拡張機能の1つであり、解析のためにXML文字列をパーサーに送るために使用されます。 XML_PARSER_CREATE() 、 XML_SET_ELEMENT_HANDLER()などの関数と組み合わせて使用され、ラベル構造を細かく制御する必要があるシナリオの処理に適しています。
XMLを動的に生成するインターフェイスがあるとします。
https://api.m66.net/data/feed.xml
このアドレスからXMLデータを取得し、 <item>タグの下にタイトルとリンクフィールドを解析する必要があります。
<?php
// 初期化パーサー
$parser = xml_parser_create();
// データを保存するための配列
$parsedData = [];
$currentTag = '';
$currentItem = [];
// Startタグプロセッサを定義します
function startElement($parser, $name, $attrs) {
global $currentTag, $currentItem;
$currentTag = strtolower($name);
if ($currentTag === 'item') {
$currentItem = [];
}
}
// エンドタグプロセッサを定義します
function endElement($parser, $name) {
global $currentTag, $currentItem, $parsedData;
if (strtolower($name) === 'item') {
$parsedData[] = $currentItem;
}
$currentTag = '';
}
// 文字データプロセッサを定義します
function characterData($parser, $data) {
global $currentTag, $currentItem;
$data = trim($data);
if (!$data) return;
if ($currentTag === 'title') {
$currentItem['title'] = (isset($currentItem['title']) ? $currentItem['title'] : '') . $data;
} elseif ($currentTag === 'link') {
$currentItem['link'] = (isset($currentItem['link']) ? $currentItem['link'] : '') . $data;
}
}
// プロセッサをセットアップします
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// リモコンから入手してください XML コンテンツ
$url = "https://api.m66.net/data/feed.xml";
$xmlData = file_get_contents($url);
if (!$xmlData) {
die("取得できません XML データ");
}
// 解析を開始します
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($parsedData);
echo "</pre>";
?>
Array
(
[0] => Array
(
[title] => サンプルタイトル1
[link] => https://www.m66.net/item/123
)
[1] => Array
(
[title] => サンプルタイトル2
[link] => https://www.m66.net/item/456
)
)
XML_PARSE()を使用して、XMLデータ構造を完全に制御し、複雑なまたは非標準構造XMLファイルに適しています。 SimplexMLほど簡潔ではありませんが、カスタム処理フローが必要なシナリオには非常に便利です。