毎日のPHP開発では、リモートサーバーからXMLデータを取得して解析する必要があることがよくあります。この記事では、 Curlを使用してXMLデータをダウンロードし、 XML_PARSEシリーズ関数と組み合わせてコンテンツを解析し、利用可能な配列構造に変換する方法を示します。
まず、PHP環境で次の拡張機能が有効になっていることを確認してください。
Curl :データをリモートでダウンロードするために使用されます
XMLパーサー:XMLドキュメントを解析するために使用されます
これらの2つの拡張機能は、組み込まれており、追加のインストールを必要としないほとんどのPHPインストールパッケージにデフォルトです。
まず、リモートアドレスからXMLコンテンツをCurlからダウンロードしましょう。
function fetchXmlData($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$data = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
return false;
}
curl_close($ch);
return $data;
}
// 例 URL
$url = 'https://api.m66.net/data/sample.xml';
$xmlContent = fetchXmlData($url);
if ($xmlContent === false) {
exit('得る XML 失敗');
}
PHPのXML_PARSE関数は、イベント駆動型のXML解析方法です。パーサーを作成して処理機能をセットアップすることにより、XMLコンテンツを構造化された配列に変換できます。
function parseXmlToArray($xml) {
$parser = xml_parser_create();
$values = [];
$index = [];
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
if (!xml_parse_into_struct($parser, $xml, $values, $index)) {
echo "XML 解析エラー: " . xml_error_string(xml_get_error_code($parser));
xml_parser_free($parser);
return false;
}
xml_parser_free($parser);
return buildXmlArray($values);
}
function buildXmlArray($values) {
$result = [];
$stack = [];
foreach ($values as $val) {
switch ($val['type']) {
case 'open':
$tag = $val['tag'];
$child = [];
if (isset($val['attributes'])) {
$child['@attributes'] = $val['attributes'];
}
$child['@children'] = [];
$stack[] = [&$result];
$result[$tag][] = &$child;
$result = &$child['@children'];
break;
case 'complete':
$tag = $val['tag'];
$entry = isset($val['value']) ? $val['value'] : '';
if (isset($val['attributes'])) {
$result[$tag][] = [
'@attributes' => $val['attributes'],
'@value' => $entry
];
} else {
$result[$tag][] = $entry;
}
break;
case 'close':
$result = &$stack[count($stack) - 1][0];
array_pop($stack);
break;
}
}
return $result;
}
上記の2つの部分を組み合わせることにより、完全な「ダウンロード +解析」プロセスを実装できます。
$url = 'https://api.m66.net/data/sample.xml';
$xmlContent = fetchXmlData($url);
if ($xmlContent) {
$parsedData = parseXmlToArray($xmlContent);
echo "<pre>";
print_r($parsedData);
echo "</pre>";
}
この記事を通じて、PHPのCurl拡張機能を使用してXMLデータをダウンロードする方法と、 XML_PARSEを使用して構造化された配列に解析する方法を習得しました。 XML_PARSEは低レベルの方法ですが、パフォーマンスが高く、依存関係が少ないため、パフォーマンス要件を持つプロジェクトに適しています。
より複雑なXMLに対処する必要がある場合は、将来的にはSimplexMLやDomDocumentなどのより高度なパーサーを使用しようとすることをお勧めします。