PHP SimpleXML解析问题:如何将<par>节点转为带name属性的关联数组?
解决SimpleXML解析节点丢失name属性的问题
问题原因
SimpleXML对节点的默认处理逻辑是:将节点文本内容作为核心值,属性存储在对象的@attributes属性中。直接把<par>节点转成索引数组时,只会保留节点内容,自动丢弃了name属性的关联关系。
解决方案
方法1:手动遍历SimpleXML对象(推荐,灵活可控)
直接遍历每个<par>节点,提取name属性作为关联数组的键,按需保存节点内容或其他属性:
假设你的XML结构类似:
<device_data> <par name="temperature">28.5</par> <par name="humidity">62</par> <par name="pressure">1012</par> <objects> <obj id="sensor_01" type="temp"/> </objects> </device_data>
对应的PHP代码:
// 加载XML文件 $xml = simplexml_load_file('device_data.xml'); // 初始化存储<par>的关联数组 $parAssoc = []; // 遍历所有<par>节点 foreach ($xml->par as $parNode) { // 强制转换为字符串避免SimpleXML对象的特性问题 $paramName = (string)$parNode['name']; $paramValue = (string)$parNode; // 存入关联数组,如需保留所有属性可扩展 $parAssoc[$paramName] = [ 'value' => $paramValue, // 若有其他属性,可添加:'attr_key' => (string)$parNode['other_attr'] ]; // 如果只需要值作为数组值,直接写: // $parAssoc[$paramName] = $paramValue; } // 打印结果 print_r($parAssoc);
方法2:JSON转数组快速处理
通过json_encode和json_decode将整个XML对象转成数组,再提取<par>的属性和内容:
// 加载XML并转成数组 $xmlString = file_get_contents('device_data.xml'); $xmlObj = simplexml_load_string($xmlString); $xmlArray = json_decode(json_encode($xmlObj), true); // 转换<par>为关联数组 $parAssoc = []; foreach ($xmlArray['par'] as $parItem) { $name = $parItem['@attributes']['name']; // 节点文本内容会被存在键"0"下 $value = $parItem['0']; $parAssoc[$name] = $value; }
注意事项
- SimpleXML对象不是普通数组,直接用
(array)强制转换时,属性会被放在@attributes子数组中,节点文本则会成为数组的数值键(如0),无法直接得到关联结构。 - 手动遍历的方法更适合自定义输出结构,比如需要同时保留多个属性时,调整起来更方便。
内容的提问来源于stack exchange,提问作者user3818264
相关产品推荐
相关产品推荐

