이 글에서는 SPL 라이브러리의 객체 메소드를 사용하여 PHP에서 XML과 배열을 변환하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
현재 많은 서비스 제공업체가 우리가 사용할 수 있는 JSON 인터페이스를 제공하고 있지만, 여전히 인터페이스 형식으로 XML을 사용해야 하는 서비스가 많기 때문에 데이터를 XML 형식으로 구문 분석하고 변환해야 합니다. PHP에는 쉽게 변환할 수 있는 json_encode() 및 json_decode()와 같은 함수가 없으므로 XML 데이터를 조작할 때 모든 사람이 이를 달성하기 위해 자신의 코드를 작성해야 하는 경우가 많습니다.
오늘은 XML 데이터 형식 변환을 처리하기 위해 SPL 확장 라이브러리의 일부 개체 메서드를 사용하는 방법을 소개합니다. 먼저, 나중에 사용할 수 있도록 XML 데이터 변환을 수행하는 클래스를 캡슐화하는 것과 동일한 클래스를 정의합니다. 단지 효과를 테스트하고 싶다면 다음 함수를 직접 작성할 수도 있습니다.
class ConvertXml{ // .... }
class ConvertXml{ public function xmlToArray(SimpleXMLIterator $xml): array { $res = []; for ($xml->rewind(); $xml->valid(); $xml->next()) { $a = []; if (!array_key_exists($xml->key(), $a)) { $a[$xml->key()] = []; } if ($xml->hasChildren()) { $a[$xml->key()][] = $this->xmlToArray($xml->current()); } else { $a[$xml->key()] = (array) $xml->current()->attributes(); $a[$xml->key()]['value'] = strval($xml->current()); } $res[] = $a; } return $res; } // ..... } $wsdl = 'http://flash.weather.com.cn/wmaps/xml/china.xml'; $xml = new SimpleXMLIterator($wsdl, 0, true); $convert = new ConvertXml(); // var_dump($convert->xmlToArray($xml)); // array(37) { // [0]=> // array(1) { // ["city"]=> // array(2) { // ["@attributes"]=> // array(9) { // ["quName"]=> // string(9) "黑龙江" // ["pyName"]=> // string(12) "heilongjiang" // ["cityname"]=> // string(9) "哈尔滨" // ["state1"]=> // string(1) "7" // ["state2"]=> // string(1) "3" // ["stateDetailed"]=> // string(15) "小雨转阵雨" // ["tem1"]=> // string(2) "21" // ["tem2"]=> // string(2) "16" // ["windState"]=> // string(21) "南风6-7级转4-5级" // } // ["value"]=> // string(0) "" // } // } // [1]=> // array(1) { // ["city"]=> // array(2) {
여기서는 SimpleXMLIterator 개체를 사용하고 있습니다. 이름에서 알 수 있듯이 해당 역할은 탐색할 수 있는 SimpleXMLElement 개체를 생성하는 것입니다. 첫 번째 매개변수는 올바른 형식의 XML 텍스트 또는 링크 주소입니다. 두 번째 매개변수는 일부 옵션 매개변수입니다. 여기서는 0만 제공하면 됩니다. 세 번째 매개변수는 첫 번째 매개변수가 링크 주소인지 여부를 나타내며 여기서는 true 를 제공합니다.
클라이언트 측에서 SimpleXMLIterator 객체를 생성하여 xmlToArray() 메서드에 전달했습니다. 이러한 방식으로 SimpleXMLIterator 개체를 사용하면 각 노드를 탐색할 수 있습니다. 다음 작업은 매우 간단합니다. 노드에 하위 노드가 있는지 확인하면 됩니다. 하위 노드가 없으면 노드의 속성과 콘텐츠를 가져옵니다.
이 테스트 링크는 날씨 정보를 얻기 위한 것입니다. 반환된 콘텐츠의 각 노드에는 속성만 있고 콘텐츠는 없습니다. 이는 값 필드가 비어 있는 변환된 배열에 반영됩니다.
class ConvertXml{ // ...... const UNKNOWN_KEY = 'unknow'; public function arrayToXml(array $a) { $xml = new SimpleXMLElement('<?xml version="1.0" standalone="yes"?><root></root>'); $this->phpToXml($a, $xml); return $xml->asXML(); } protected function phpToXml($value, &$xml) { $node = $value; if (is_object($node)) { $node = get_object_vars($node); } if (is_array($node)) { foreach ($node as $k => $v) { if (is_numeric($k)) { $k = 'number' . $k; } if (!is_array($v) && !is_object($v)) { $xml->addChild($k, $v); } else { $newNode = $xml->addChild($k); $this->phpToXml($v, $newNode); } } } else { $xml->addChild(self::UNKNOWN_KEY, $node); } } } var_dump($convert->arrayToXml($data)); // string(84454) "<?xml version="1.0" standalone="yes"?> // <root><unlikely-outliner><subject><mongo-db><outline><chapter><getting-started><number0> ........... // "
arrayToXml()에서는 먼저 SimpleXMLElement 개체를 사용하여 기본 루트 노드 구조를 만듭니다. 그런 다음 phpToXml() 메서드를 사용하여 모든 노드를 생성합니다. 왜 두 가지 방법으로 나누나요? phpToXml() 메서드는 재귀적으로 호출되어야 하기 때문에 각 재귀 중에 루트 노드를 다시 생성할 필요가 없습니다. 루트 노드 아래에서 addChild()를 사용하여 하위 노드를 추가하기만 하면 됩니다.
phpToXml() 코드에서는 get_object_vars() 함수도 사용합니다. 즉, 전달된 배열 항목의 내용이 객체인 경우, 이 함수를 통해 객체의 모든 속성을 얻을 수 있습니다. 객체를 배열로 생각하면 각 속성 값은 키-값 쌍입니다.
각 키 값을 순회할 때 현재 키에 해당하는 내용이 배열인지 객체인지 확인합니다. 콘텐츠가 이 두 가지 형식이 아닌 경우 현재 콘텐츠가 현재 노드의 하위 노드로 직접 추가됩니다. 배열이나 객체인 경우 모든 배열 내용을 순회할 때까지 계속해서 재귀적으로 추가합니다.
테스트의 $data 내용이 매우 깁니다. 테스트 코드 링크를 통해 Github에서 직접 확인하실 수 있습니다.
이 기사의 내용은 XML 작업을 위한 SPL 확장 라이브러리의 두 개체 사용에 대한 간단한 연구입니다. 이를 통해 XML 데이터 형식을 쉽게 변환할 수 있습니다. 물론 XML 형식 변환을 위한 다른 방법도 있는데 이에 대해서는 나중에 배우겠습니다!
테스트 코드:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/在PHP中使用SPL库中的对象方法进行XML与数组的转换.php
추천 학습: php 비디오 튜토리얼
위 내용은 SPL 라이브러리의 객체 메소드를 사용하여 XML을 PHP의 배열로 변환하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!