jeg har et script til parsing af en xml fil, så jeg kan få et output til noget tv guide til min fjernbetjening. Jeg har brugt mc2xml til at grabbe xml-filen, men der mangler en del kanaler og ikke mindst de fleste af programmerne. Derfor vil jeg istedet bruge ontv.dk's xml feed. Jeg kan af en eller anden grund ikke få scriptet til at parse ontv's xml uden at redigere det.
Den xml-fil der virker har denne form:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-name="BDS" generator-info-name="mc2xml" generator-info-url="mailto">
<channel id="I40.751651.microsoft.com">
<display-name>40 DR1</display-name>
<display-name>40</display-name>
<display-name>DR1</display-name>
</channel>
<programme start="20110116060000 +0100" stop="20110116062500 +0100" channel="I40.751651.microsoft.com">
<title lang="da">Ni Hao Kai Lan</title>
<desc lang="da">For børn. Kai Lans verden er fyldt med kinesisk kultur og magiske seværdigheder og lyde. Hvorend du vender dig er der noget fantastisk og smukt at se...</desc>
<date>20110116</date>
<category lang="dk">Børneprogram</category>
<category lang="dk">Serier</category>
<category lang="dk">Øvrigt</category>
<language>da</language>
<length units="minutes">25</length>
</programme>
</tv>
den xml-fil jeg ikke kan få til at virke har denne form:
<?xml version="1.0" encoding="UTF-8" ?>
<tv generator-info-name="www.ontv.dk/xmltv">
<channel id="www.ontv.dk/tv/1">
<display-name lang="dk">DR1 DK</display-name>
</channel>
<programme channel="www.ontv.dk/tv/1" start="20110115060000 +0100" stop="20110115062000 +0100">
<title lang="dk">Ni-Hao Kai Lan</title>
<sub-title lang="dk">Animationsserie med dansk tale.</sub-title>
<desc lang="dk">Lær kinesisk med den søde Kai Lan.</desc>
<category lang="EN">kids</category>
</programme>
</tv>
den umiddelbare forskel er i tagget display-name, hvor lang="dk" er tilføjet.
scriptet ser således ud (jeg ved ereg ikke er med i næste version og simple xml vil være en bedre løsning, men jeg ser ingen grund til at skrive det hele om til dette formål)
<?php
/* Script for parsing xmltv-file and registering info in Mysql */
//Connection to Mysql
$MySQL_Host="";
$MySQL_Port="3306";
$MySQL_User="";
$MySQL_Passw="";
$MySQL_Db=""; //MYSQL DATABASE NAME
// Function for connecting to Mysql
function connect_mysql() {global $MySQL_Host, $MySQL_User, $MySQL_Passw;
if (! $linkid=@mysql_connect("$MySQL_Host","$MySQL_User","$MySQL_Passw")) {
echo "Impossible to establish a connection to Mysql ",$MySQL_Host,"<BR>";
exit;
}
return $linkid;
}
//Connecting to Mysql
$db_connect = connect_mysql();
//Selecting Mysql database
mysql_select_db($MySQL_Db , $db_connect);
$handle = @fopen('LOCATION OF FILE', "r");
if ($handle) {
while (!feof($handle)) {
$lines[] = fgets($handle, 4096);
}
fclose($handle);
}
//doesn't delete programs today (problem with swiss channels not starting until tomorrow)
$sql_delete_programmes = "delete from programmes where date_start < '" . date("Y-m-d 00:00:00") . "' AND date_start > '" . date("Y-m-d 23:59:59") . "'";
$req_delete_programmes = mysql_query($sql_delete_programmes);
$chains_insert = "";
$programmes_insert = "";
$sql_insert_programmes = "";
$count_chains = 0;
$count_progs = 0;
$array_ids_chains = array();
for($i=0;$i<=count($lines);$i++) {
//Retrieving the chains
if(eregi("<channel", $lines[$i])) {
//Id_chain
eregi("id=\"([a-z0-9\.-/_]*)\"", $lines[$i], $regs_chain);
$id_chain = $regs_chain[1];
//Name chain
$array_search = array("<display-name>", "</display-name>", " ", "\r", "\n", " ");
$name_chain = utf8_decode(mb_strtoupper(str_ireplace($array_search,"", $lines[$i+3])));
$name_chain2 = utf8_encode(mb_strtoupper(str_ireplace($array_search,"", $lines[$i+3])));
//Rename the chains because of problems with certain characters
if(eregi("DR1", $name_chain)) {$name_chain = "DR1";}
//Logo chain
eregi("<icon src=\"([a-z0-9\.-_ :/]*)\"", $lines[$i+2], $regs_chain);
$logo_chain = $regs_chain[1];
//Retreive the chains that are interesting for us
if($name_chain == "DR1") {
//Exclude duplicates
if( ! eregi("\"$name_chain\"", $chains_insert)) {
if($chains_insert) {
$chains_insert .= ",";
}
print $name_chain . "\n";
$chains_insert .= " (\"$id_chain\", \"$name_chain\", \"$logo_chain\")";
//Register the id's in a table
$array_ids_chains[] = $id_chain;
$count_chains++;
}
}
}
//Retrieving the programmes
if(eregi("<programme", $lines[$i])) {
eregi("start=\"([0-9]*)", $lines[$i], $regs_chain);
$prog_start = $regs_chain[1];
eregi("stop=\"([0-9]*)", $lines[$i], $regs_chain);
$prog_stop = $regs_chain[1];
eregi("channel=\"([a-z0-9\.-_]*)\"", $lines[$i], $regs_chain);
$prog_id_channel = $regs_chain[1];
eregi("title lang=\"[a-z]*\">(.*)</title>", $lines[$i+1], $regs_chain);
$prog_title = utf8_encode($regs_chain[1]);
empty($regs_chain);
eregi("<sub-title lang=\"[a-z]*\">(.*)</sub-title>", $lines[$i+2], $regs_chain);
$prog_sub_title = utf8_encode($regs_chain[1]);
empty($regs_chain);
//For searching by category
for($j=1;$j<20;$j++) {
if(eregi("<category lang=\"[a-z]*\">(.*)</category>", $lines[$i+$j], $regs_chain)) {
$prog_category = ucfirst(utf8_encode($regs_chain[1]));
empty($regs_chain);
break;
}
}
//integrating only the id chains that are conecerning us
if(in_array($prog_id_channel, $array_ids_chains)) {
$sql_insert_programmes = "insert into programmes values (\"$prog_id_channel\", \"" . addslashes(utf8_decode($prog_title)) . "\", \"" . addslashes(utf8_decode($prog_sub_title)) . "\", \"\", \"" . addslashes(utf8_decode($prog_category)) . "\", \"$prog_start\", \"$prog_stop\")";
$req_insert_programmes = mysql_query($sql_insert_programmes);
$count_progs++;
}
}
}
$sql_delete_chains = "delete from chaines";
$req_delete_chains = mysql_query($sql_delete_chains);
$sql_insert_chains = "insert into chains values $chains_insert";
$req_insert_chains = mysql_query($sql_insert_chains);
$sql_insert_logs = "insert into logs values (NULL, '$count_chains chains enregistrees\n$count_progs programmes enregistres',NOW())";
$req_insert_logs = mysql_query($sql_insert_logs);
echo "\n PHP -> " . date("d/m/Y H:i") . " Updating the pronto database ended\n";
?>
er er naturligvis et par linier der åbentlyst skal laves om; linie 53 og 54 skal være i+1 i stedet for i+3, da der kun er 1 linie med display-name i den anden xml-fil
Linie 52 synes at være et problem for mig - jeg har indsat
$array_search = array("<display-name lang=\"[a-z]*\">", "</display-name>", " ", "\r", "\n", " ");
i stedet for den oprindelige, men det virker stadig ikke.
Hvis jeg fjerner lang="dk" fra display-name tagget virker det fint med det oprindelige script. Det er bare en smule bøvlet at rette xml-filen hver gang jeg downloader den.
Der må være et eller andet jeg helt overser, men hvad?