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
相关产品推荐
相关产品推荐

