PHP解析API返回XML为数组失败:数组为空问题排查
解决XML转数组后为空的问题
嘿,我仔细看了你的代码和API返回的XML内容,问题出在SimpleXMLElement的遍历和节点访问方式上,咱们一步步拆解问题并修正:
先说说你代码里的核心错误
- 根节点访问错误:
$oXML本身就是根节点<distributionGroups>,你用$oXML["distributionGroups"]是在找这个节点的名为distributionGroups的属性,但你的XML里根节点并没有这个属性,所以遍历的是空对象,自然填充不出数组。 - 子节点访问错误:你要遍历的是根节点下的
<group>子节点,正确的遍历对象应该是$oXML->group;另外访问<id>这类子元素时,用$value["id"]是找节点属性,而你需要的是节点文本内容,应该用$value->id。 - 排序时的键名错误:后面排序用
$row["id"],但你的数组结构是$row["group"]["id"],这个键不存在会导致排序逻辑失效。
修正后的完整代码
function download_page($path){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$path); curl_setopt($ch, CURLOPT_FAILONERROR,1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT, 15); $retValue = curl_exec($ch); curl_close($ch); return $retValue; } $sXML = download_page('https://url/api/user/distgroup/domain/user?t=ticketofuser'); echo "xml start: ". htmlentities($sXML); $oXML = new SimpleXMLElement($sXML); $groups = []; // 提前初始化数组,避免未定义变量警告 // 遍历根节点下的所有<group>子节点 foreach($oXML->group as $key => $value) { // 把SimpleXMLElement对象转成对应的数据类型,后续使用更方便 $groups[$key]["group"]["id"] = (string)$value->id; $groups[$key]["group"]["domain"] = (string)$value->domain; $groups[$key]["group"]["name"] = (string)$value->name; $groups[$key]["group"]["type"] = (string)$value->type; $groups[$key]["group"]["loggedIn"] = (string)$value->loggedIn === 'true'; $groups[$key]["group"]["nightMode"] = (string)$value->nightMode === 'true'; $groups[$key]["group"]["loggedInAgents"] = (int)$value->loggedInAgents; $groups[$key]["group"]["freeAgents"] = (int)$value->freeAgents; $groups[$key]["group"]["callsWaiting"] = (int)$value->callsWaiting; } // 修正排序的键名,对应数组结构 $temp = []; foreach ($groups as $key => $row) { $temp[$key] = $row["group"]["id"]; } array_multisort($temp, SORT_ASC, $groups); $_SESSION["groups"] = $groups; // 打印数组用print_r才能看到具体内容,直接echo只会输出Array echo "groups: "; print_r($groups);
额外的小优化
- 提前初始化
$groups数组,避免PHP抛出未定义变量的警告。 - 将SimpleXMLElement的子元素转换为字符串、布尔值或整数,后续使用数组时不会意外拿到SimpleXMLElement对象,减少潜在问题。
- 打印数组时用
print_r()或者var_dump(),直接echo $groups只会输出Array,看不到实际的数组内容。
内容的提问来源于stack exchange,提问作者Kristian
相关产品推荐
相关产品推荐

