PHP開発では、特にレガシーシステムをドッキングしたり、特定のAPIを読んだ場合、XMLデータの処理は一般的な要件です。 JSONは現在より人気がありますが、XMLにはまだ多くのデータが提供されています。フロントエンドの処理またはその後の処理を容易にするには、XMLをJSON形式に変換する必要があることがよくあります。
この記事では、PHPのXML_PARSE関数を使用してXML文字列を配列構造に解析し、 json_encodeを介してJSON形式に変換します。
最初に、サンプルXMLデータを準備して、リモートアドレスから得られた応答をシミュレートします(たとえば、 https://api.m66.net/data.xml ):
$xml_data = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>PHP プログラミングの練習</title>
<author>チャン・サン</author>
<year>2021</year>
</book>
<book>
<title>詳細な理解 XML</title>
<author>li si</author>
<year>2020</year>
</book>
</books>
XML;
XML_PARSEは、低レベルのXML解析機能です。通常、 XML_PARSER_CREATEとコールバック関数を組み合わせて、XMLコンテンツを配列に変換します。 XMLを連想配列に変換する単純な解析関数は次のとおりです。
function xml_to_array($xml_string) {
$parser = xml_parser_create();
xml_parse_into_struct($parser, $xml_string, $values, $index);
xml_parser_free($parser);
$result = [];
$stack = [];
foreach ($values as $val) {
switch ($val['type']) {
case 'open':
$tag = $val['tag'];
$child = [];
if (!empty($val['attributes'])) {
$child = $val['attributes'];
}
array_push($stack, [&$result, $tag]);
if (!isset($result[$tag])) {
$result[$tag] = [];
}
$result[$tag][] = $child;
break;
case 'complete':
$tag = $val['tag'];
$value = isset($val['value']) ? $val['value'] : '';
if (!isset($result[$tag])) {
$result[$tag] = [];
}
$result[$tag][] = $value;
break;
case 'close':
array_pop($stack);
break;
}
}
return $result;
}
注:上記のコードは使用法のデモ用であり、可能なすべてのXML構造を考慮していません。 SimplexMLやDomdocumentなどのより完全なパーサーを生産環境で使用することをお勧めします。
配列構造を使用すると、JSONに変換するのは非常に簡単です。JSON_ENCODEを使用するだけです。
$parsed_array = xml_to_array($xml_data);
$json_result = json_encode($parsed_array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json_result;
出力の結果は、ほぼ次のとおりです。
{
"BOOK": [
{
"TITLE": "PHP プログラミングの練習",
"AUTHOR": "チャン・サン",
"YEAR": "2021"
},
{
"TITLE": "詳細な理解 XML",
"AUTHOR": "li si",
"YEAR": "2020"
}
]
}
XML_PARSEは根本的な制御を提供しますが、複雑なXMLを扱うときは面倒に思えます。 PHPからSimplexmlを使用することを検討してください。
$xml = simplexml_load_string($xml_data);
$json = json_encode($xml, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;
この方法は、クリアな構造を持つXMLによりシンプルで適しています。