PHP获取跨域XML时单条message返回null问题排查
问题原因与修复方案
问题根源
当XML仅包含1个<message>节点时,simplexml_load_file解析后转换为JSON的过程中,单个节点不会被自动包装为数组;而存在多个<message>节点时,会被处理为数组结构。
具体差异:
- 多条message:
$json['message']是元素为属性数组的索引数组,格式为[['@attributes' => ...], ['@attributes' => ...]] - 单条message:
$json['message']直接是单个属性数组,格式为['@attributes' => ...]
你的代码中直接通过for循环遍历$json['message'],单条场景下count($json['message'])统计的是属性的数量,而$json['message'][$i]的下标访问不存在,最终赋值为null,导致返回异常。
修复方案
在解析JSON后,先判断$json['message']是否为索引数组(即是否存在多个节点),如果是单个节点,手动将其包装为数组,确保后续循环逻辑统一。
修改后的完整代码:
<?php header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header('Access-Control-Allow-Origin: *'); ini_set('user_agent','mflscripts'); if($_GET["type"]=="chat") { //REQUIRED PARAMETERS if(!isset($_GET['server_id'])) { echo json_encode(array()); die(); } else $server_id = $_GET['server_id']; if(!isset($_GET['league_id'])) { echo json_encode(array()); die(); } else $league_id = $_GET['league_id']; if(!isset($_GET['year'])) { echo json_encode(array()); die(); } else $year = $_GET['year']; //OPTIONAL PARAMETERS if(!isset($_GET['cookie'])) $cookie = ''; else $cookie = $_GET['cookie']; if(!isset($_GET['random'])) $random = ''; else $random = $_GET['random']; $url = 'ht'.'tps://www'.$server_id.'.myfantasyleague.com/fflnetdynamic'.$year.'/'.$league_id.'_chat.xml?MFL_USER_ID='.$cookie.'&random='.$random; $xml=simplexml_load_file($url) or die("Error: Cannot create object"); $json_xml = json_encode($xml); $json = json_decode($json_xml,TRUE); $my_json = array(); $my_json['messages'] = array(); $my_json['messages']['message'] = array(); // 关键修复:统一单条/多条message的数组结构 if (!isset($json['message'][0])) { $json['message'] = [$json['message']]; } for($i=0;$i<count($json['message']);$i++){ $my_json['messages']['message'][$i] = $json['message'][$i]['@attributes']; } echo json_encode($my_json); } ?>
验证效果
当读取单条message的XML时,修复后的代码会将单个属性数组包装为数组,循环正常执行,返回结果变为:
{"messages":{"message":[{"message":"asdf","franchise_id":"0000","id":"1661170418wng204","posted":"Mon Aug 22 8:13:38 a.m. ET 2022"}]}}
多条message的场景不受影响,依然正常返回预期的数组结构。
内容的提问来源于stack exchange,提问作者MShack
相关产品推荐
相关产品推荐

