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

PHP使用simplexml_load_string解析XML无法获取correct属性问题

问题原因

不是XML结构层级过深导致的,问题出在SimpleXML对象转JSON的默认处理逻辑上:
json_encode()处理SimpleXML对象时,仅会提取节点的文本内容作为转换后的值,节点的属性默认不会被包含到生成的JSON数据中,你最终得到的$arrOutput['Answer']只会是所有答案文本组成的一维数组,不存在correct相关字段。

解决方法

方法1:直接使用SimpleXML原生方法读取属性(推荐)

无需转JSON再转数组,直接通过SimpleXML提供的attributes()方法读取属性:

// 读取Question节点属性
$questionType = (string)$objXmlDocument->attributes()->type;
$questionText = (string)$objXmlDocument->attributes()->text;

// 遍历Answer节点读取属性和文本
$answerList = [];
foreach ($objXmlDocument->Answer as $answerNode) {
    $isCorrect = (string)$answerNode->attributes()->correct === 'true';
    $answerText = (string)$answerNode;
    $answerList[] = [
        'text' => $answerText,
        'correct' => $isCorrect
    ];
}

方法2:自定义转换方法导出带属性的数组

如果需要将完整XML结构转换为数组使用,可以自己写转换方法,主动把节点属性纳入转换结果:

function xml_to_array(SimpleXMLElement $xml): array
{
    $data = [];
    // 处理当前节点属性
    foreach ($xml->attributes() as $attrKey => $attrVal) {
        $data['@attributes'][$attrKey] = (string)$attrVal;
    }
    // 处理子节点
    if ($xml->count() > 0) {
        foreach ($xml->children() as $childTag => $childNode) {
            $childData = xml_to_array($childNode);
            // 同名多节点存为二维数组
            if (isset($data[$childTag])) {
                if (!is_array($data[$childTag]) || !isset($data[$childTag][0])) {
                    $data[$childTag] = [$data[$childTag]];
                }
                $data[$childTag][] = $childData;
            } else {
                $data[$childTag] = $childData;
            }
        }
    } else {
        // 无子节点时存文本值
        $data['value'] = (string)$xml;
    }
    return $data;
}

// 调用方法得到数组
$arrOutput = xml_to_array($objXmlDocument);
// 读取Answer的correct属性方式:$arrOutput['Answer'][5]['@attributes']['correct']

内容的提问来源于stack exchange,提问作者matthew parisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:36:04