PHP中simplexml_load_string解析xml的正确方式

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 对接我php接口的是安卓客户端,json字符串中在一个元素的时候是对象类型,多个元素的时候是数组类型,安卓客户端解析就失败了。 所以引申出这篇文章,详细测试、记录一下php中解析xml方式和细节

前言


为什么写这篇文章,因为他娘的宣言又踩坑了。 在对接别人接口时,他们使用的是xml格式交互的。 其中的格式可能如下


<RSP2003>
  <TotalNum>39</TotalNum>
  <CityList>
    <CityCode>N1127</CityCode>
    <CityName>三水四会</CityName>
    <CityTypeCode>3</CityTypeCode>
    <CityTypeName>内陆城市</CityTypeName>
    <PinyinJX>SSSH</PinyinJX>
    <PinyinQP>Sanshuisihui</PinyinQP>
    <CityOrder>207</CityOrder>
    <CityOperationType>2</CityOperationType>
  </CityList>
  // 这是一个list  如果还有更多元素 就在下面继续
  <CityList>
    <CityCode>N1127</CityCode>
    <CityName>三水四会</CityName>
    <CityTypeCode>3</CityTypeCode>
    <CityTypeName>内陆城市</CityTypeName>
    <PinyinJX>SSSH</PinyinJX>
    <PinyinQP>Sanshuisihui</PinyinQP>
    <CityOrder>207</CityOrder>
    <CityOperationType>2</CityOperationType>
  </CityList>
</RSP2003>


有的情况下,CityList里只有一个元素,一般情况下是多个 一开始写的php程序如下


<?php
$xml = '伪代码 xml字符串如上';
echo json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));


只有一个元素的时候


"RSP2003": {
    "TotalNum": "39",
    "CityList": {
        "CityCode": "N1127",
        "CityName": "\u4e09\u6c34\u56db\u4f1a",
        "CityTypeCode": "3",
        "CityTypeName": "\u5185\u9646\u57ce\u5e02",
        "PinyinJX": "SSSH",
        "PinyinQP": "Sanshuisihui",
        "CityOrder": "207",
        "CityOperationType": "2"
    }
}


多个元素的时候


"RSP2003": {
    "TotalNum": "39",
    "CityList": [{
        "CityCode": "N1127",
        "CityName": "\u4e09\u6c34\u56db\u4f1a",
        "CityTypeCode": "3",
        "CityTypeName": "\u5185\u9646\u57ce\u5e02",
        "PinyinJX": "SSSH",
        "PinyinQP": "Sanshuisihui",
        "CityOrder": "207",
        "CityOperationType": "2"
    }, {
        "CityCode": "N1128",
        "CityName": "\u5927\u6ca5\u76d0\u6b65",
        "CityTypeCode": "3",
        "CityTypeName": "\u5185\u9646\u57ce\u5e02",
        "PinyinJX": "DLYB",
        "PinyinQP": "daliyanbu",
        "CityOrder": "208",
        "CityOperationType": "2"
    }]


问题所在


对接我php接口的是安卓客户端,json字符串中在一个元素的时候是对象类型,多个元素的时候是数组类型,安卓客户端解析就失败了。 所以引申出这篇文章,详细测试、记录一下php中解析xml方式和细节


simplexml_load_string


simplexml_load_string函数将会把每一个节点都解析成一个SimpleXMLElement对象 php官方文档地址:https://www.php.net/manual/zh/class.simplexmlelement.php 注意这里我描述的是:每一个节点。 首先我们先来解析一个最简单的例子


$xml = <<<xml
<?xml version="1.0" encoding="UTF-8"?>
<RSP2003>
    <TotalNum>39</TotalNum>
</RSP2003>
xml;
$object = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
var_dump($object);


输出内容


object(SimpleXMLElement)#1 (1) {
  ["TotalNum"]=>
  string(2) "39"
}


可以看到,这里是一个对象,我们需要怎么获取里面的TotalNum节点呢,TotalNum这个值又是什么类型的? 在这一步打印出来它是一个string类型 我们接着看吧


var_dump($object->TotalNum);


输出 TotalNum又是一个SimpleXMLElement对象,它的值储存在[0]中 我们写数组的下标


object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(2) "39"
}


继续取出


var_dump($object->TotalNum[0]);


输出内容 注意哈。这里是真实的运行结果,不是我复制重复了(对象的编号已经增加了),自己可以去测试一下


object(SimpleXMLElement)#4 (1) {
  [0]=>
  string(2) "39"
}


那么我们这个值到底怎么取出呢!!


取出SimpleXMLElement对象的值


var_dump($object->TotalNum->__toString());


回到我们最开始的问题,怎么解析xml列表


解析列表,(只有一个元素也为数组)


<?php
$xml = <<<xml
<?xml version="1.0" encoding="UTF-8"?>
<RSP2003>
    <TotalNum>39</TotalNum>
    <CityList>
        <CityName>第一个城市</CityName>
    </CityList>
    <CityList>
        <CityName>第二个城市</CityName>
    </CityList>
</RSP2003>
xml;
$object = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
var_dump(count($object->TotalNum)); // 1
var_dump(count($object->CityList)); // 2
var_dump($object->CityList->count()); // 2
var_dump($object->CityList[0]);
var_dump($object->CityList[1]);


用法探讨


尝试了挺多种逻辑,都无法用函数封装成自动解析(因为每一个节点都是平等的,怎么知道它要解析成数组还是对象呢?) 如果你有好想法,希望能留言一起讨论 我觉得只能面向过程式地手动组装成数组,然后输出api结果

目录
相关文章
|
16天前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
|
19天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
20天前
|
PHP 开发者 容器
PHP命名空间深度解析与最佳实践####
本文深入探讨了PHP中命名空间(namespace)的机制、应用场景及最佳实践,旨在帮助开发者有效避免命名冲突,提升代码的组织性和可维护性。通过实例讲解,本文将引导您理解如何在实际项目中灵活运用命名空间,以及如何遵循业界公认的最佳实践来优化您的PHP代码结构。 ####
|
20天前
|
数据库连接 PHP 开发者
PHP中的异常处理深度解析####
【10月更文挑战第29天】 本文深入探讨了PHP中的异常处理机制,通过实例演示如何有效地捕获和处理运行时错误,提升代码的健壮性和可维护性。我们将从基础概念出发,逐步深入到自定义异常类的应用,以及如何在复杂项目中实施最佳实践。 --- ###
42 4
|
18天前
|
PHP 开发者
PHP 7新特性深度解析及其最佳实践
【10月更文挑战第31天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,再到错误处理机制的变革。我们将通过实际代码示例,展示如何高效利用这些新特性来编写更加健壮和高效的PHP应用。无论你是PHP新手还是资深开发者,这篇文章都将为你打开一扇窗,让你看到PHP 7的强大之处。
|
19天前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用
|
29天前
|
PHP 数据安全/隐私保护 开发者
PHP 7新特性解析与实践
【10月更文挑战第20天】本文将深入浅出地介绍PHP 7的新特性,包括性能提升、语法改进等方面。我们将通过实际代码示例,展示如何利用这些新特性优化现有项目,提高开发效率。无论你是PHP新手还是资深开发者,都能从中获得启发和帮助。
|
1月前
|
PHP 开发者 UED
PHP中的异常处理深度解析####
本文深入探讨了PHP中的异常处理机制,旨在帮助开发者更好地理解和运用try-catch结构来提升代码的健壮性和可维护性。通过实例讲解与最佳实践分享,读者将学会如何有效地捕捉、处理并记录异常,从而避免程序因未预见的错误而崩溃,确保应用的稳定性和用户体验。 ####
|
17天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
19 0
下一篇
无影云桌面