Table of Contents
Convert XML to PHP array
PHP array or object converted to XML
Summary
Home Backend Development PHP Tutorial Detailed explanation of how to use object methods in the SPL library to convert XML and arrays in PHP

Detailed explanation of how to use object methods in the SPL library to convert XML and arrays in PHP

Jun 21, 2021 pm 04:01 PM
php

This article will introduce to you how to use the object method in the SPL library to convert XML and arrays in PHP? It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

Recommended: "PHP Video Tutorial"

Although many service providers now provide JSON interfaces for us to use, there are still many services that must use XML as the interface format, which requires us to process data in XML format. Perform parsing conversion. There are no functions like json_encode() and json_decode() in PHP that allow us to easily convert, so when operating XML data, everyone often needs to write their own code to achieve it.

Today, we introduce the use of some object methods in the SPL extension library to handle XML data format conversion. First, we define a class, which is equivalent to encapsulating a class that operates XML data conversion for our future use. If you just want to test the effect, you can also write the following function directly.

class ConvertXml{
    // ....
}
Copy after login

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) {
Copy after login

Here, we are using the SimpleXMLIterator object. As can be seen from the name, its role is to generate SimpleXMLElement objects that can be traversed. The first parameter is properly formatted XML text or a link address. The second parameter is some option parameters. Here we can just give 0 directly. The third parameter indicates whether the first parameter is a link address, here we give true .

We generated the SimpleXMLIterator object on the client side and passed it to the xmlToArray() method. In this way, the SimpleXMLIterator object allows us to traverse each node. The next thing is very simple. We only need to determine whether the node has child nodes. If there are child nodes, call the current method recursively. If there are no child nodes, get the node's attributes and content.

This test link is to obtain weather information. Each node in the returned content has only attributes and no content. This is reflected in the converted array where the value field is empty.

PHP array or object converted to 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>  ...........
// "
Copy after login

In arrayToXml(), we first created a basic root node structure using the SimpleXMLElement object. Then use the phpToXml() method to create all nodes. Why split it into two methods? Because the phpToXml() method needs to be called recursively, we do not need to re-create the root node during each recursion. We only need to use addChild() under the root node to add child nodes.

In the code of phpToXml(), we also use the get_object_vars() function. That is, when the content of the array item passed in is an object, all properties of the object can be obtained through this function. If you think of an object as an array, each attribute value is its key-value pair.

When traversing each key value, we determine whether the content corresponding to the current key is an array or an object. If the content is not in these two forms, the current content will be directly added as a child node of the current node. If it is an array or object, continue to add recursively until all the array contents are traversed.

The $data content of the test is very long. You can check it directly on Github through the link to the test code.

Summary

The content of this article is to simply learn the use of two objects for XML operations in an SPL extension library. Through them, we can easily convert XML data format. Of course, we have other methods for XML format conversion, which we will learn about later!

Test code:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/Use the object method in the SPL library in PHP Conversion of XML and array.php

The above is the detailed content of Detailed explanation of how to use object methods in the SPL library to convert XML and arrays in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

In this chapter, we will understand the Environment Variables, General Configuration, Database Configuration and Email Configuration in CakePHP.

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

To work with date and time in cakephp4, we are going to make use of the available FrozenTime class.

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

To work on file upload we are going to use the form helper. Here, is an example for file upload.

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

In this chapter, we are going to learn the following topics related to routing ?

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

CakePHP Creating Validators CakePHP Creating Validators Sep 10, 2024 pm 05:26 PM

Validator can be created by adding the following two lines in the controller.

See all articles