PHP 개발에서 XML 데이터 처리는 특히 레거시 시스템에 도킹하거나 특정 API를 읽을 때 일반적인 요구 사항입니다. JSON은 현재 더 인기가 있지만 XML에는 여전히 많은 데이터가 제공됩니다. 프론트 엔드 처리 또는 후속 처리를 용이하게하려면 XML을 JSON 형식으로 변환해야합니다.
이 기사에서는 PHP의 XML_PARSE 기능을 사용하여 XML 문자열을 배열 구조로 구문 분석 한 다음 JSON_ENCODE를 통해 JSON 형식으로 변환합니다.
먼저 원격 주소 (예 : https://api.m66.net/data.xml )에서 얻은 응답을 시뮬레이션하기 위해 샘플 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에 더 간단하고 더 적합합니다.