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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:36:03