You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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;
?>

代码说明

  1. XML加载:用simplexml_load_string解析XML字符串,若解析失败直接终止执行。
  2. 属性提取:先获取<object>标签的pk和model属性,存入结果数组。
  3. 字段处理:遍历每个<field>标签,以name属性作为键,标签内容作为值;同时根据type属性转换数据类型,让JSON数据更规范。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:11:01