PHP SimpleXML因缺失时间字段报错,需实现全天事件展示适配
问题原因
原代码直接读取不存在的starttime/endtime字段会触发SimpleXML下标未定义报错,且未做全天事件的判断逻辑。
修正后完整代码
//加载xml文件 $sxml = simplexml_load_file($url) or die("Error: Cannot create object"); echo '<div class="calendar">'; # 提取所有事件的开始日期 $starts = $sxml->xpath('//event/startdate'); # 日期去重 $dates = array_unique($starts); foreach($dates as $date) { echo "<li><h1>{$date}</h1></li>\n"; # 直接查询当前日期对应的所有完整事件节点 $expression = "//event[startdate='{$date}']"; $events = $sxml->xpath($expression); # 遍历事件输出内容 foreach ($events as $event){ // 判断是否为全天事件 if (strval($event->alldayevent) === 'true') { $timeContent = 'All Day'; } else { // 非全天事件读取起止时间,增加存在性判断避免报错 $startTime = isset($event->starttime) ? strval($event->starttime) : ''; $endTime = isset($event->endtime) ? strval($event->endtime) : ''; $timeContent = $startTime && $endTime ? "{$startTime} - {$endTime}" : '时间未标注'; } // 读取事件描述和分类 $desc = strval($event->description); $category = strval($event->category); // 输出事件项 echo "\t<li><div class='time'>{$timeContent}</div><div class='event'><b>{$desc}</b> // {$category}</div></li>\n"; } echo "\n"; } echo "</div>";
核心修改点
- 调整xpath查询逻辑,直接获取对应日期的完整event节点,无需多次查询兄弟节点,代码可读性和运行效率更高
- 新增
alldayevent字段判断逻辑,符合预期的全天事件显示规则 - 增加字段存在性校验,避免特殊场景下字段缺失触发PHP报错
- 所有SimpleXML节点读取后统一转成字符串类型,避免偶发的对象输出异常
内容的提问来源于stack exchange,提问作者user2141311
相关产品推荐
相关产品推荐

