如何使用PHP将API返回的XML数据转换为JSON?
将EcomExpress API返回的XML转换为JSON(PHP实现)
问题描述
本人对XML并不熟悉,尝试了多种网上找到的解决方案但均无效,恳请帮助通过PHP将这份API返回的XML数据转换为JSON。以下是对应的XML响应内容:
<?xml version="1.0" encoding="utf-8"?> <ecomexpress-objects version="1.0"> <object pk="1" model="awb"> <field type="BigIntegerField" name="awb_number">115979601</field> <field type="CharField" name="orderid">001</field> <field type="FloatField" name="actual_weight">0.8</field> <field type="CharField" name="origin">DELHI-DLW</field> <field type="CharField" name="destination">DELHI-DLW</field> <field type="CharField" name="current_location_name">DELHI-DLW</field> <field type="CharField" name="current_location_code">DLW</field> <field type="CharField" name="customer">Freshbells - 471459</field> <field type="CharField" name="consignee">Forward</field> <field type="CharField" name="pickupdate"></field> <field type="CharField" name="status">Shipment Uploaded</field> <field type="CharField" name="tracking_status">Shipment Not Handed over</field> <field type="CharField" name="reason_code"></field> <field type="CharField" name="reason_code_description"></field> <field type="CharField" name="reason_code_number">001</field> <field type="CharField" name="receiver"></field> <field type="CharField" name="lat">0.0000000</field> <field type="CharField" name="long">0.0000000</field> <field type="CharField" name="rev_pickup_signature" ></field> <field type="CharField" name="rev_pickup_packed_image" ></field> <field type="CharField" name="rev_pickup_open_image" ></field> </object> </ecomexpress-objects>
解决方案
PHP内置XML处理扩展,可通过SimpleXMLElement解析XML,转成数组后再用json_encode生成JSON。针对这份XML的结构,我们可以专门处理<field>标签的name属性作为键,标签内容作为值,同时保留<object>的属性。
代码实现
<?php // 替换为API返回的原始XML内容 $xmlString = '<?xml version="1.0" encoding="utf-8"?><ecomexpress-objects version="1.0"><object pk="1" model="awb"><field type="BigIntegerField" name="awb_number">115979601</field><field type="CharField" name="orderid">001</field><field type="FloatField" name="actual_weight">0.8</field><field type="CharField" name="origin">DELHI-DLW</field><field type="CharField" name="destination">DELHI-DLW</field><field type="CharField" name="current_location_name">DELHI-DLW</field><field type="CharField" name="current_location_code">DLW</field><field type="CharField" name="customer">Freshbells - 471459</field><field type="CharField" name="consignee">Forward</field><field type="CharField" name="pickupdate"></field><field type="CharField" name="status">Shipment Uploaded</field><field type="CharField" name="tracking_status">Shipment Not Handed over</field><field type="CharField" name="reason_code"></field><field type="CharField" name="reason_code_description"></field><field type="CharField" name="reason_code_number">001</field><field type="CharField" name="receiver"></field><field type="CharField" name="lat">0.0000000</field><field type="CharField" name="long">0.0000000</field><field type="CharField" name="rev_pickup_signature" ></field><field type="CharField" name="rev_pickup_packed_image" ></field><field type="CharField" name="rev_pickup_open_image" ></field></ecomexpress-objects>'; // 加载XML并处理解析失败的情况 $xml = simplexml_load_string($xmlString); if (!$xml) { die('XML解析失败'); } $result = []; // 提取object标签的属性 $object = $xml->object; $result['object'] = [ 'pk' => (string)$object['pk'], 'model' => (string)$object['model'], 'fields' => [] ]; // 遍历所有field标签,整理键值对并按需转换数据类型 foreach ($object->field as $field) { $fieldName = (string)$field['name']; $fieldValue = (string)$field; // 根据field的type属性转换对应数据类型 switch ((string)$field['type']) { case 'BigIntegerField': $fieldValue = (int)$fieldValue; break; case 'FloatField': $fieldValue = (float)$fieldValue; break; default: // 默认保留字符串类型 break; } $result['object']['fields'][$fieldName] = $fieldValue; } // 转换为格式化后的JSON $jsonResult = json_encode($result, JSON_PRETTY_PRINT); // 输出结果 echo $jsonResult; ?>
代码说明
- XML加载:用
simplexml_load_string解析XML字符串,若解析失败直接终止执行。 - 属性提取:先获取
<object>标签的pk和model属性,存入结果数组。 - 字段处理:遍历每个
<field>标签,以name属性作为键,标签内容作为值;同时根据type属性转换数据类型,让JSON数据更规范。 - JSON转换:用
json_encode将数组转为格式化后的JSON,JSON_PRETTY_PRINT让输出更易读。
输出示例
{ "object": { "pk": "1", "model": "awb", "fields": { "awb_number": 115979601, "orderid": "001", "actual_weight": 0.8, "origin": "DELHI-DLW", "destination": "DELHI-DLW", "current_location_name": "DELHI-DLW", "current_location_code": "DLW", "customer": "Freshbells - 471459", "consignee": "Forward", "pickupdate": "", "status": "Shipment Uploaded", "tracking_status": "Shipment Not Handed over", "reason_code": "", "reason_code_description": "", "reason_code_number": "001", "receiver": "", "lat": "0.0000000", "long": "0.0000000", "rev_pickup_signature": "", "rev_pickup_packed_image": "", "rev_pickup_open_image": "" } } }
内容的提问来源于stack exchange,提问作者Mansoor Ali K
相关产品推荐
相关产品推荐

