> 백엔드 개발 > PHP 문제 > SPL 라이브러리의 객체 메소드를 사용하여 XML을 PHP의 배열로 변환하는 방법

SPL 라이브러리의 객체 메소드를 사용하여 XML을 PHP의 배열로 변환하는 방법

醉折花枝作酒筹
풀어 주다: 2023-03-10 19:22:01
앞으로
1543명이 탐색했습니다.

이 글에서는 SPL 라이브러리의 객체 메소드를 사용하여 PHP에서 XML과 배열을 변환하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

SPL 라이브러리의 객체 메소드를 사용하여 XML을 PHP의 배열로 변환하는 방법

현재 많은 서비스 제공업체가 우리가 사용할 수 있는 JSON 인터페이스를 제공하고 있지만, 여전히 인터페이스 형식으로 XML을 사용해야 하는 서비스가 많기 때문에 데이터를 XML 형식으로 구문 분석하고 변환해야 합니다. PHP에는 쉽게 변환할 수 있는 json_encode() 및 json_decode()와 같은 함수가 없으므로 XML 데이터를 조작할 때 모든 사람이 이를 달성하기 위해 자신의 코드를 작성해야 하는 경우가 많습니다.

오늘은 XML 데이터 형식 변환을 처리하기 위해 SPL 확장 라이브러리의 일부 개체 메서드를 사용하는 방법을 소개합니다. 먼저, 나중에 사용할 수 있도록 XML 데이터 변환을 수행하는 클래스를 캡슐화하는 것과 동일한 클래스를 정의합니다. 단지 효과를 테스트하고 싶다면 다음 함수를 직접 작성할 수도 있습니다.

class ConvertXml{
    // ....
}
로그인 후 복사

XML을 PHP 배열로

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 개체를 사용하면 각 노드를 탐색할 수 있습니다. 다음 작업은 매우 간단합니다. 노드에 하위 노드가 있는지 확인하면 됩니다. 하위 노드가 없으면 노드의 속성과 콘텐츠를 가져옵니다.

이 테스트 링크는 날씨 정보를 얻기 위한 것입니다. 반환된 콘텐츠의 각 노드에는 속성만 있고 콘텐츠는 없습니다. 이는 값 필드가 비어 있는 변환된 배열에 반영됩니다.

PHP 배열 또는 개체를 XML로 변환

class ConvertXml{

    // ......

    const UNKNOWN_KEY = 'unknow';
    
    public function arrayToXml(array $a)
    {
        $xml = new SimpleXMLElement(&#39;<?xml version="1.0" standalone="yes"?><root></root>&#39;);
        $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 = &#39;number&#39; . $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿