SimpleXML加载子节点报错:Trying to get property及children()调用失败排查
问题分析与解决方案
首先看你的错误信息:Trying to get property 'Store' of non-object 和 Call to a member function children() on null,这说明你在访问Store节点的时候,前面的某个节点不存在,导致拿到了null。
核心错误:节点访问路径错误
当你用simplexml_load_file加载XML文件后,返回的$xml对象直接对应XML的根节点<Config>,所以你不需要再通过$xml->Config来访问根节点。你的代码里多了一层->Config,导致后续的->Core、->Store都找不到对应的节点,最终返回null。
额外问题:XML结构不完整(示例中的情况)
你提供的XML示例里有很多未闭合的标签,比如<SystemFiles>、<Info>、<Network>、<Capture>都没有对应的闭合标签,这会导致SimpleXML加载XML失败,返回false,后续的节点访问自然也会出错。确保你的实际XML是结构完整、格式正确的。
修正后的代码
public static function get_storage_data() { $xmlPath = '/var/www/content/data/data.xml'; if(file_exists($xmlPath)) { $xml = simplexml_load_file($xmlPath); // 先判断XML是否加载成功 if($xml === false) { write_log("Failed to load data.xml: invalid XML format"); return; } // 直接从根节点(Config)访问Core->Store if(isset($xml->Core->Store)) { foreach ($xml->Core->Store->children() as $mount) { // 可以用echo $mount->getName(); 来输出节点名,或者访问节点内容 echo $mount->getName() . ": " . (string)$mount . "\n"; } } else { write_log("Store node not found in data.xml"); } } else { write_log(sprintf("data.xml not found at %s", $xmlPath)); } }
其他建议
- 处理大XML时,SimpleXML是流式处理的,一般没问题,但如果XML特别大(比如几十MB以上),可以考虑用
XMLReader来逐节点读取,性能更好。 - 总是检查
simplexml_load_file的返回值,不要只判断文件存在——文件存在但格式错误也会导致加载失败。
内容的提问来源于stack exchange,提问作者TheBadBossy
相关产品推荐
相关产品推荐

