详解如何在PHP中使用SPL库中的对象方法进行XML与数组的转换

本篇文章给大家介绍一下如何在PHP中使用SPL库中的对象方法进行XML与数组的转换?有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

虽说现在很多的服务提供商都会提供 JSON 接口供我们使用,但是,还是有不少的服务依然必须使用 XML 作为接口格式,这就需要我们来对 XML 格式的数据进行解析转换。而 PHP 中并没有像 json_encode() 、 json_decode() 这样的函数能够让我们方便地进行转换,所以在操作 XML 数据时,大家往往都需要自己写代码来实现。

今天,我们介绍的是使用 SPL 扩展库中的一些对象方法来处理 XML 数据格式的转换。首先,我们定义一个类,就相当于封装一个操作 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 对象就能让我们遍历各个结点了,接下来的事情就很简单了,我们只需要判断一下结点是否还有子结点,如果有子结点则递归调用当前这个方法。如果没有子结点了,就获取结点的属性和内容。

这个测试链接是获取天气信息的,返回的内容中每个结点都只有属性没有内容,体现在转换后的数组中就是 value 字段都是空的。

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 上查阅。

总结

这篇文章的内容是简单的学习了一个 SPL 扩展库中对于 XML 操作的两个对象的使用。通过它们,我们可以方便的转换 XML 数据格式。当然,对于 XML 的格式转换来说,我们还有其它的方法,以后学到了再说!

测试代码:

在PHP中使用SPL库中的对象方法进行XML与数组的转换.php

关于详解如何在PHP中使用SPL库中的对象方法进行XML与数组的转换的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/244207.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2023年3月29日 23:09
下一篇 2023年3月29日 23:09

相关推荐

  • 处理 PHP 开发版本问题

    一、Composer 安装包composer install 之后报错vagrant@homestead:~/Code/sample$ composer install Loading composer repositories with package information Installing dependencies (including require-dev) fr…

    2022年6月25日
    0150
  • PHP中的自动化部署工具。

    PHP作为一种广泛应用的编程语言,它的应用范围十分广泛。无论是个人网站还是大型企业应用,PHP都有着相应的应用场景。然而,在开发PHP应用过程中,如何进行自动化部署是十分重要的。因为自动化部署可以极大地减少人…

    2023年5月30日
    02
  • php+redis实现对200w用户的即时推送服务

    怎么实现对200w用户的即时推送,这个推送可以理解为调用第三方的接口,push,sms之类的东西。当时先写了一个demo 直接读取DB然后单个推送,结果。。。。可想而知于是设计一套基于redis+php多进程的方案,用着还不…

    2022年6月21日
    0122
  • PHP中的权限管理系统指南。

    在现今的互联网时代,为了保护网站和应用程序的安全,权限管理系统变得越来越重要。PHP,作为一种广泛使用的编程语言,也可以应用于权限管理系统的开发。本文将介绍PHP中的权限管理系统,并提供一些开发和实施它的…

    2023年5月23日
    04
  • PHP中如何进行软件产品的文档管理?

    PHP是一种流行的Web开发语言,广泛应用于构建各种规模的Web应用程序。在Web开发过程中,软件产品文档的管理至关重要。这篇文章将探讨如何在PHP中进行软件产品文档管理。什么是软件文档管理?软件文档管理是管理软件…

    2023年5月17日
    00
  • 教你用php读取elf结构

    前提知识UNIX系统的可执行文件都采用ELF格式,类型分为目标文件、可执行文件和共享库ELF格式探析之三:sections本例基于64位的小端序linux机器以读取目标文件hello.o为例#include <stdio.h> void say_hello(c…

    2022年6月25日
    0149
  • 今日分享PHP header的7种用法。

    PHP header函数用于在发送HTTP响应之前输出一些信息,如HTTP状态码、内容类型等。它有7种用法,包括设置状态码、添加自定义头信息、重定向到其他URL、显示错误信息等。 在PHP中,header()函数是一个非常重要的工具…

    2024年7月24日
    00
  • PHP中如何进行安全漏洞扫描处理?

    随着互联网的普及和应用, web应用程序的安全性显得愈发重要。 PHP 作为应用程序的一种重要语言,其本身带来的不安全因素也非常明显。在使用PHP开发web应用程序的过程中,开发人员需要充分了解PHP的安全问题,并且…

    2023年5月17日
    05

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息