SPL 라이브러리의 객체 메소드를 사용하여 PHP에서 XML 및 배열을 변환하는 방법에 대한 자세한 설명

藏色散人
풀어 주다: 2023-04-10 08:48:01
앞으로
1832명이 탐색했습니다.

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

추천: "PHP 비디오 튜토리얼"

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

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

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

Convert XML to PHP array

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('<?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/SPL 라이브러리의 개체 메서드를 사용하여 PHP.php에서 XML 및 배열을 변환

위 내용은 SPL 라이브러리의 객체 메소드를 사용하여 PHP에서 XML 및 배열을 변환하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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