解析XML电视节目表,找出现在播放的内容

时间:2014-10-29 17:36:13

标签: php xml

我有一个电视节目表的XML文件,TV.xml:

http://wklej.to/j4GQm

我想从此为网站创建一些epg。由于我没有经验,不幸的是我很难。我想获得特定的频道数据,然后将其与实际时间进行比较,并显示此频道现在播放的内容(以及之后将播放的内容)。

我尝试了什么:

 <?php
$xml=simplexml_load_file("TV.xml");
$me = "sub-title";
foreach($xml->programme as $item){
    echo "Start : " .date("G:i d.m.Y", strtotime(substr($item["start"], 0,  -6))) . '<br>';
    echo "End : " .date("G:i d.m.Y", strtotime(substr($item["stop"], 0,  -6))) . '<br>';
    echo "Channel : ".$item["channel"]. "<br>";
    echo "Title : ".$item->title. "<br>";
    echo "Info : ".$item->$me. "<br>";
    echo "Description : ".$item->desc. "<br>";
    echo "<br>";
}
?> 

所以我会有一个频道列表。但是如何显示特定的频道信息?不是整个清单。最重要的是,如何将其与实际时间进行比较,并仅显示正在播放的节目?

1 个答案:

答案 0 :(得分:0)

您已经成功解析了程序信息,因此解析通道数据应该很容易。您可能希望将通道名称保存在数组中,以便可以使用通道名称替换$item["channel"]中的ID。你可以这样做:

$channels = array();

foreach ($xml->channel as $c) {
    # convert these values to strings for storing in the array
    $channels[ $c['id']->__toString() ] = $c->{'display-name'}->__toString();
}

这给出了一个形式的数组:

Array
(
    [TVPuls.pl] => TV Puls
    [TVPuls2.pl] => TV Puls 2
    ...
)

要查找当前正在播放的内容,最简单的方法是以与列表中显示的格式相同的格式格式化当前日期和时间,然后找出哪些节目具有涵盖当前内容的开始和结束时间时间:

$time = date( "YmdHi" );  // e.g. 201410291949

# we'd be looking for start times less than $time and end times greater than $time

将它们与您之前的代码放在一起,并且只打印出现在的程序:

$channels = array();
foreach ($xml->channel as $c) {
    $channels[ $c['id']->__toString() ] = $c->{'display-name'}->__toString();
}

$time = date( "YmdHi" );

foreach($xml->programme as $item) {
# or to search for programmes on a specific channel only:
# foreach($xml->xpath('programme[@channel="TVPuls.pl"]') as $item) {

    $start = substr( (string)$item["start"], 0, -8);
    $end   = substr( (string)$item["stop"], 0, -8);
    # if the time is right...
    if ($time > $start && $time < $end) {
        echo "Start : " .date("G:i d.m.Y", strtotime($start)) . '<br>';
        echo "End : " .date("G:i d.m.Y", strtotime($end)) . '<br>';
        # the channel has to be converted to a string to use as an array key
        echo "Channel : ". $channels[ $item["channel"]->__toString() ]. "<br>";
        echo "Title : ".$item->title. "<br>";
        # put braces and quotes around element names with a hyphen in them
        echo "Info : ".$item->{'sub-title'}. "<br>";
        echo "Description : ".$item->desc. "<br>";
    }
}

频道电视Puls的输出:

开始时间:19:50 29.10.2014
结束时间:20:55 29.10.2014
频道:TV Puls
标题:斯巴达克斯:Zemsta:Miejscewświecie
信息: [serial historyczny](斯巴达克斯:复仇:这个世界的一个地方)(第2集)(2012)(美国)
描述:Spartakus i jegotowarzyszewędrująnapołudnieinstrium。 WkrótceprzejmująnależącądoRzymianwillę,wktórejprzezpewienczasieszkałaNaevia。 Kobietazostałajużjednakosdesłanawinne miejsce。 Podosłonąnocyjedenzniewolników,mężczyznaoimieniu Tyberiusz,próbujababićSpartakusa。 Zachwyconyjegoodwagątrackiwojownik niezabijaśmiałka,leczpostanawiaprzyjąćgow szeregi swoich ludziiwyszkolić。 Po powrocie do Kapui Lukrecjaotrzymujewiadomośćodtajemniczego nieznajomego。 Wkrótcewychodzina jaw,żeinformacjochochodziłaodAshura,zktórymkobietapotajemniewspółpracuje WRzymiewciążtrwabuntgladiatorów。 Mieszkańcybojąsię,jakiebędątegokonsekwencje。 Chcącstłumićpowstanieiuspokoićobywateli,Gajusz Klaudiusz Glaber(Craig Parker)udajesięzezezesswojąarmiądoKapui。 Liczy,żenamiejscuspacyfikujegrupęzdesperowanychniewolników。 IchdowódcąjestSpartakus(利亚姆麦金太尔),którywahasię,jakądodogępowinienterazwybrać 杰西警告 利亚姆麦金太尔,达斯汀克莱尔,马努贝内特,露西劳利斯