如何使用 PHP 解压缩 xml 文件
How to unzip xml file using PHP
我的 PHP
系统上有一个压缩的 XML
文件。
如何解压缩以将其加载到 XMLDOM
?
我每个 zip
存档只有一个 XML
文件。
提前致谢。
您可以使用 php 类 ZipArchive and DOMDocument 即:
<?php
//set the correct xml headers to output to browser
header("Content-type: text/xml");
$zipFile = "file.zip";
$zip = new ZipArchive;
if ($zip->open($zipFile))
{
//get the xml filename inside the zip
$xmlFile = $zip->getNameIndex(0); //you only have 1 xml file iside of the zip
$zip->close();
//read the xml file inside the zip without extracting it to disk (memory)
$xml = file_get_contents("zip://$zipFile#$xmlFile");
//create a new document
$dom = new DOMDocument('1.0', "UTF-8");
//load teh xml file
$dom->loadXML($xml);
//Here you can manipulate the XML dom , add, remove nodes, etc.
//save and echo the XML
echo $dom->saveXML();
} else {
echo 'zip open failed failed';
}
备注:
- How do I ask a good question?
- 我用 this xml file 测试了代码,它按预期工作。
<?php
set_time_limit(0);
echo "Start Time - " . date('Y-m-d H:i:s') . "\n";
//MySQL connection
//$link = mysql_connect('HOST', 'userbane', 'password')or die("Dtabase Not connected.");
$link = mysql_connect('HOST', 'userbane', 'password')or die("Dtabase Not connected.");
mysql_select_db("unified", $link);
//FTP connection
$ftp_server = "xx.xx.xxxx";
$ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$epgVersion = FALSE;
if (ftp_login($ftp_conn, 'usename', 'password')) {
$date = date('Y-m-d');
//Processing ZIP Files
echo "Processing ZIP Files\n";
$contents = ftp_nlist($ftp_conn, "-t *.zip");
if (count($contents) > 0) {
$epgVersion = TRUE;
foreach ($contents as $content) {
$file_name = trim($content);
$zipDirectory = "/home/customscript/epg/epg_zip_data/$date";
if (!is_dir($zipDirectory)) {
mkdir($zipDirectory);
}
$zipTmpDirectory = "/home/customscript/epg/epg_zip_tmp";
if (!is_dir($zipTmpDirectory)) {
mkdir($zipTmpDirectory);
}
$local_file = $zipDirectory . "/" . $file_name;
// try to download $server_file and save to $local_file
if (ftp_get($ftp_conn, $local_file, $file_name, FTP_BINARY)) {
echo "Successfully written to $local_file\n";
//Posting to Appinventiv
postToAppinventiv($local_file);
//continue;
$zip = new ZipArchive; //unzip file
if ($zip->open($local_file) === TRUE) { //extract contents to /data/ folder
$zip->extractTo($zipTmpDirectory . '/');
$zip->close(); //close the archive
$files = glob($zipTmpDirectory . "/" . "*.xml");
if (is_array($files)) {
foreach ($files as $filename) {
$fileParseStatus = parseXmlFile($filename, 1);
if ($fileParseStatus) {
echo "File '$filename' has been successfully processed.\n";
if (unlink($filename)) {
echo "File '$filename' deleted successfully.\n";
} else {
echo "File '$filename' deleted Failed.\n";
}
} else {
echo "Unable to open '$filename' XML file.\n";
}
}
}
//unlink($local_file);
} else {
echo "Failed to open the archive!\n";
}
} else {
echo "There was a problem\n";
}
if (ftp_delete($ftp_conn, $file_name)) {
echo "$file_name deleted from ftp successfully\n";
} else {
echo "$file_name could not be deleted from ftp\n";
}
}
echo "Processing of ZIP Files are done.\n";
} else {
echo "No zip file to process.\n";
}
//Processing XML Files
echo "Processing XML Files\n";
$contents = ftp_nlist($ftp_conn, "-t *.xml");
if (count($contents) > 0) {
$epgVersion = TRUE;
foreach ($contents as $content) {
$file_name = trim($content);
$xmlDirectory = "/home/customscript/epg/epg_xml_data/$date";
if (!is_dir($xmlDirectory)) {
mkdir($xmlDirectory);
}
$xmlTmpDirectory = "/home/customscript/epg/epg_xml_tmp";
if (!is_dir($xmlTmpDirectory)) {
mkdir($xmlTmpDirectory);
}
$local_file = $xmlDirectory . "/" . $file_name;
// try to download $server_file and save to $local_file
if (ftp_get($ftp_conn, $local_file, $file_name, FTP_BINARY)) {
echo "Successfully written to $local_file\n";
//Posting to Appinventiv
postToAppinventiv($local_file);
copy($xmlDirectory . "/" . $file_name, $xmlTmpDirectory . "/" . $file_name);
$fileParseStatus = parseXmlFile($xmlTmpDirectory . "/" . $file_name, 2);
if ($fileParseStatus) {
echo "File '$file_name' has been successfully processed.\n";
if (unlink($xmlTmpDirectory . "/" . $file_name)) {
echo "File '$file_name' deleted successfully.\n";
} else {
echo "File '$file_name' deleted Failed.\n";
}
} else {
echo "Unable to open '$file_name' XML file.\n";
}
} else {
echo "There was a problem\n";
}
if (ftp_delete($ftp_conn, $file_name)) {
echo "$file_name deleted from ftp successfully\n";
} else {
echo "$file_name could not be deleted from ftp\n";
}
}
echo "Processing of XML Files are done.\n";
} else {
echo "No xml file to process.\n";
}
} else {
echo "Unable to connect with the FTP server.\n";
}
ftp_close($ftp_conn);
if ($epgVersion) {
$epgUpdateQuery = "UPDATE version set EPG_VERSION=EPG_VERSION+1";
$epgUpdateQueryStatus = mysql_query($epgUpdateQuery, $link);
if ($epgUpdateQueryStatus) {
echo "EPG version updated successfully.\n";
} else {
echo "EPG version update query failed.\n";
}
}
echo "End Time - " . date('Y-m-d H:i:s') . "\n";
function parseXmlFile($filename, $queryType) {
$link = $GLOBALS['link'];
$file_get = file_get_contents($filename);
if ($file_get) {
$xml = simplexml_load_string($file_get);
$chan_category = mysql_escape_string(trim($xml->channel->category));
$channel_name = mysql_escape_string(trim($xml->channel->{'display-name'}));
$service_id = mysql_escape_string(trim($xml->channel->serviceid));
$channel_logo = mysql_escape_string(trim($xml->channel->ChannelLogo));
$programme = $xml->programme;
$programme_date = trim($xml->programme->attributes()->start); // delete data above current date
$expld_date = explode(" ", $programme_date);
$s_curdate = trim($expld_date[0]);
$start_curtime_date = date("Y-m-d", strtotime($s_curdate));
if ($queryType == 1) {
$deleteType = ">=";
} else if ($queryType == 2) {
$deleteType = "=";
}
$sql_del = "DELETE FROM `Program_Details` WHERE Service_Id = '$service_id' and date(`Start_Time`) $deleteType '$start_curtime_date'";
mysql_query($sql_del, $link);
//echo $sql_del . PHP_EOL;
$i = 0;
$insert_programs_sql = array();
foreach ($programme as $prog) {
$cast = $prog->cast;
$actors = '';
$directors = '';
$producers = '';
if ($cast) {
foreach ($cast as $c) {
$actor_arr = array();
foreach ($c->actor as $t) {
$actor_arr[] = (string) mysql_escape_string(trim($t));
}
$actors = implode(',', $actor_arr);
$directors = mysql_escape_string(trim($c->director));
$producers = mysql_escape_string(trim($c->producer));
}
}
$start = (string) trim($prog->attributes()->start);
$stop = (string) trim($prog->attributes()->stop);
$expld_sdate = explode(" ", $start);
$s_date = trim($expld_sdate[0]);
$start_time = date("Y-m-d H:i:s", strtotime($s_date));
$expld_edate = explode(" ", $stop);
$e_date = trim($expld_edate[0]);
$end_time = date("Y-m-d H:i:s", strtotime($e_date));
// Create two new DateTime-objects...
$date1 = new DateTime($start);
$date2 = new DateTime($stop);
// The diff-methods returns a new DateInterval-object...
$diff = $date2->diff($date1);
// Call the format method on the DateInterval-object
$hour = $diff->format('%h');
$min = $diff->format('%i');
$duration = ($hour * 60) + $min;
$prod_id = mysql_escape_string(trim($prog->programmeid));
$title = mysql_escape_string(trim($prog->title));
$desc = mysql_escape_string(trim($prog->desc));
$category = mysql_escape_string(trim($prog->category));
$subcat = mysql_escape_string(trim($prog->{'sub-category'}));
$VideoUrl = mysql_escape_string(trim($prog->ProgrammeVideoUrl));
$ImageUrl = mysql_escape_string(trim($prog->ImageUrl));
$insert_programs_sql[] = "('$service_id','$channel_name','$prod_id','$title','$desc','$category','$subcat','$ImageUrl','$VideoUrl','$start_time','$end_time','$chan_category','$channel_logo','$actors','$directors','$producers','$duration')";
$i++;
if ($i === 2000) {
$sql_prog = "INSERT INTO `Program_Details`(`Service_Id`,`Service_Name`, `Program_Id`, `Title`, `Description`, `Category`, `sub_categories`, `image_urls`, `video_urls`, `Start_Time`,`end_time`,`channel_categories`,`channel_logos`,actors,directors,producers,Duration) VALUES " . implode(',', $insert_programs_sql);
$epg_programs_insert_query_status = mysql_query($sql_prog, $link);
if (!$epg_programs_insert_query_status) {
die(mysql_errno($link));
}
$i = 0;
$insert_programs_sql = array();
}
}
if (count($insert_programs_sql) > 0) {
$sql_prog = "INSERT INTO `Program_Details`(`Service_Id`,`Service_Name`, `Program_Id`, `Title`, `Description`, `Category`, `sub_categories`, `image_urls`, `video_urls`, `Start_Time`,`end_time`,`channel_categories`,`channel_logos`,actors,directors,producers,Duration) VALUES " . implode(',', $insert_programs_sql);
$epg_programs_insert_query_status = mysql_query($sql_prog, $link);
if (!$epg_programs_insert_query_status) {
die(mysql_errno($link));
}
}
return TRUE;
} else {
return FALSE;
}
}
function postToAppinventiv($file) {
$url = "http://172.31.xx.xxx/admin/epgzip";
//$file_name_with_full_path = realpath("./$file");
//$post = array('epg_zip' => new CurlFile($file));
$post = array('epg_zip' => '@' . $file);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout in seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'abvjjlk: xxxxxxxxxxx',
'authorization: xxxxxxxxxxx'
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec($ch);
//curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if ($info['http_code'] == 200) {
logging("INFO", $file . ":" . $result);
return $result;
} else {
logging("ERROR", $result);
return FALSE;
}
}
function logging($type, $message) {
$logFileName = '/home/customscript/epg/logs/' . date('Y-m-d') . ".log";
$message = date('Y-m-d H:i:s') . '|' . $type . '|' . $message . PHP_EOL;
error_log($message, 3, $logFileName);
}
我的 PHP
系统上有一个压缩的 XML
文件。
如何解压缩以将其加载到 XMLDOM
?
我每个 zip
存档只有一个 XML
文件。
提前致谢。
您可以使用 php 类 ZipArchive and DOMDocument 即:
<?php
//set the correct xml headers to output to browser
header("Content-type: text/xml");
$zipFile = "file.zip";
$zip = new ZipArchive;
if ($zip->open($zipFile))
{
//get the xml filename inside the zip
$xmlFile = $zip->getNameIndex(0); //you only have 1 xml file iside of the zip
$zip->close();
//read the xml file inside the zip without extracting it to disk (memory)
$xml = file_get_contents("zip://$zipFile#$xmlFile");
//create a new document
$dom = new DOMDocument('1.0', "UTF-8");
//load teh xml file
$dom->loadXML($xml);
//Here you can manipulate the XML dom , add, remove nodes, etc.
//save and echo the XML
echo $dom->saveXML();
} else {
echo 'zip open failed failed';
}
备注:
- How do I ask a good question?
- 我用 this xml file 测试了代码,它按预期工作。
<?php
set_time_limit(0);
echo "Start Time - " . date('Y-m-d H:i:s') . "\n";
//MySQL connection
//$link = mysql_connect('HOST', 'userbane', 'password')or die("Dtabase Not connected.");
$link = mysql_connect('HOST', 'userbane', 'password')or die("Dtabase Not connected.");
mysql_select_db("unified", $link);
//FTP connection
$ftp_server = "xx.xx.xxxx";
$ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$epgVersion = FALSE;
if (ftp_login($ftp_conn, 'usename', 'password')) {
$date = date('Y-m-d');
//Processing ZIP Files
echo "Processing ZIP Files\n";
$contents = ftp_nlist($ftp_conn, "-t *.zip");
if (count($contents) > 0) {
$epgVersion = TRUE;
foreach ($contents as $content) {
$file_name = trim($content);
$zipDirectory = "/home/customscript/epg/epg_zip_data/$date";
if (!is_dir($zipDirectory)) {
mkdir($zipDirectory);
}
$zipTmpDirectory = "/home/customscript/epg/epg_zip_tmp";
if (!is_dir($zipTmpDirectory)) {
mkdir($zipTmpDirectory);
}
$local_file = $zipDirectory . "/" . $file_name;
// try to download $server_file and save to $local_file
if (ftp_get($ftp_conn, $local_file, $file_name, FTP_BINARY)) {
echo "Successfully written to $local_file\n";
//Posting to Appinventiv
postToAppinventiv($local_file);
//continue;
$zip = new ZipArchive; //unzip file
if ($zip->open($local_file) === TRUE) { //extract contents to /data/ folder
$zip->extractTo($zipTmpDirectory . '/');
$zip->close(); //close the archive
$files = glob($zipTmpDirectory . "/" . "*.xml");
if (is_array($files)) {
foreach ($files as $filename) {
$fileParseStatus = parseXmlFile($filename, 1);
if ($fileParseStatus) {
echo "File '$filename' has been successfully processed.\n";
if (unlink($filename)) {
echo "File '$filename' deleted successfully.\n";
} else {
echo "File '$filename' deleted Failed.\n";
}
} else {
echo "Unable to open '$filename' XML file.\n";
}
}
}
//unlink($local_file);
} else {
echo "Failed to open the archive!\n";
}
} else {
echo "There was a problem\n";
}
if (ftp_delete($ftp_conn, $file_name)) {
echo "$file_name deleted from ftp successfully\n";
} else {
echo "$file_name could not be deleted from ftp\n";
}
}
echo "Processing of ZIP Files are done.\n";
} else {
echo "No zip file to process.\n";
}
//Processing XML Files
echo "Processing XML Files\n";
$contents = ftp_nlist($ftp_conn, "-t *.xml");
if (count($contents) > 0) {
$epgVersion = TRUE;
foreach ($contents as $content) {
$file_name = trim($content);
$xmlDirectory = "/home/customscript/epg/epg_xml_data/$date";
if (!is_dir($xmlDirectory)) {
mkdir($xmlDirectory);
}
$xmlTmpDirectory = "/home/customscript/epg/epg_xml_tmp";
if (!is_dir($xmlTmpDirectory)) {
mkdir($xmlTmpDirectory);
}
$local_file = $xmlDirectory . "/" . $file_name;
// try to download $server_file and save to $local_file
if (ftp_get($ftp_conn, $local_file, $file_name, FTP_BINARY)) {
echo "Successfully written to $local_file\n";
//Posting to Appinventiv
postToAppinventiv($local_file);
copy($xmlDirectory . "/" . $file_name, $xmlTmpDirectory . "/" . $file_name);
$fileParseStatus = parseXmlFile($xmlTmpDirectory . "/" . $file_name, 2);
if ($fileParseStatus) {
echo "File '$file_name' has been successfully processed.\n";
if (unlink($xmlTmpDirectory . "/" . $file_name)) {
echo "File '$file_name' deleted successfully.\n";
} else {
echo "File '$file_name' deleted Failed.\n";
}
} else {
echo "Unable to open '$file_name' XML file.\n";
}
} else {
echo "There was a problem\n";
}
if (ftp_delete($ftp_conn, $file_name)) {
echo "$file_name deleted from ftp successfully\n";
} else {
echo "$file_name could not be deleted from ftp\n";
}
}
echo "Processing of XML Files are done.\n";
} else {
echo "No xml file to process.\n";
}
} else {
echo "Unable to connect with the FTP server.\n";
}
ftp_close($ftp_conn);
if ($epgVersion) {
$epgUpdateQuery = "UPDATE version set EPG_VERSION=EPG_VERSION+1";
$epgUpdateQueryStatus = mysql_query($epgUpdateQuery, $link);
if ($epgUpdateQueryStatus) {
echo "EPG version updated successfully.\n";
} else {
echo "EPG version update query failed.\n";
}
}
echo "End Time - " . date('Y-m-d H:i:s') . "\n";
function parseXmlFile($filename, $queryType) {
$link = $GLOBALS['link'];
$file_get = file_get_contents($filename);
if ($file_get) {
$xml = simplexml_load_string($file_get);
$chan_category = mysql_escape_string(trim($xml->channel->category));
$channel_name = mysql_escape_string(trim($xml->channel->{'display-name'}));
$service_id = mysql_escape_string(trim($xml->channel->serviceid));
$channel_logo = mysql_escape_string(trim($xml->channel->ChannelLogo));
$programme = $xml->programme;
$programme_date = trim($xml->programme->attributes()->start); // delete data above current date
$expld_date = explode(" ", $programme_date);
$s_curdate = trim($expld_date[0]);
$start_curtime_date = date("Y-m-d", strtotime($s_curdate));
if ($queryType == 1) {
$deleteType = ">=";
} else if ($queryType == 2) {
$deleteType = "=";
}
$sql_del = "DELETE FROM `Program_Details` WHERE Service_Id = '$service_id' and date(`Start_Time`) $deleteType '$start_curtime_date'";
mysql_query($sql_del, $link);
//echo $sql_del . PHP_EOL;
$i = 0;
$insert_programs_sql = array();
foreach ($programme as $prog) {
$cast = $prog->cast;
$actors = '';
$directors = '';
$producers = '';
if ($cast) {
foreach ($cast as $c) {
$actor_arr = array();
foreach ($c->actor as $t) {
$actor_arr[] = (string) mysql_escape_string(trim($t));
}
$actors = implode(',', $actor_arr);
$directors = mysql_escape_string(trim($c->director));
$producers = mysql_escape_string(trim($c->producer));
}
}
$start = (string) trim($prog->attributes()->start);
$stop = (string) trim($prog->attributes()->stop);
$expld_sdate = explode(" ", $start);
$s_date = trim($expld_sdate[0]);
$start_time = date("Y-m-d H:i:s", strtotime($s_date));
$expld_edate = explode(" ", $stop);
$e_date = trim($expld_edate[0]);
$end_time = date("Y-m-d H:i:s", strtotime($e_date));
// Create two new DateTime-objects...
$date1 = new DateTime($start);
$date2 = new DateTime($stop);
// The diff-methods returns a new DateInterval-object...
$diff = $date2->diff($date1);
// Call the format method on the DateInterval-object
$hour = $diff->format('%h');
$min = $diff->format('%i');
$duration = ($hour * 60) + $min;
$prod_id = mysql_escape_string(trim($prog->programmeid));
$title = mysql_escape_string(trim($prog->title));
$desc = mysql_escape_string(trim($prog->desc));
$category = mysql_escape_string(trim($prog->category));
$subcat = mysql_escape_string(trim($prog->{'sub-category'}));
$VideoUrl = mysql_escape_string(trim($prog->ProgrammeVideoUrl));
$ImageUrl = mysql_escape_string(trim($prog->ImageUrl));
$insert_programs_sql[] = "('$service_id','$channel_name','$prod_id','$title','$desc','$category','$subcat','$ImageUrl','$VideoUrl','$start_time','$end_time','$chan_category','$channel_logo','$actors','$directors','$producers','$duration')";
$i++;
if ($i === 2000) {
$sql_prog = "INSERT INTO `Program_Details`(`Service_Id`,`Service_Name`, `Program_Id`, `Title`, `Description`, `Category`, `sub_categories`, `image_urls`, `video_urls`, `Start_Time`,`end_time`,`channel_categories`,`channel_logos`,actors,directors,producers,Duration) VALUES " . implode(',', $insert_programs_sql);
$epg_programs_insert_query_status = mysql_query($sql_prog, $link);
if (!$epg_programs_insert_query_status) {
die(mysql_errno($link));
}
$i = 0;
$insert_programs_sql = array();
}
}
if (count($insert_programs_sql) > 0) {
$sql_prog = "INSERT INTO `Program_Details`(`Service_Id`,`Service_Name`, `Program_Id`, `Title`, `Description`, `Category`, `sub_categories`, `image_urls`, `video_urls`, `Start_Time`,`end_time`,`channel_categories`,`channel_logos`,actors,directors,producers,Duration) VALUES " . implode(',', $insert_programs_sql);
$epg_programs_insert_query_status = mysql_query($sql_prog, $link);
if (!$epg_programs_insert_query_status) {
die(mysql_errno($link));
}
}
return TRUE;
} else {
return FALSE;
}
}
function postToAppinventiv($file) {
$url = "http://172.31.xx.xxx/admin/epgzip";
//$file_name_with_full_path = realpath("./$file");
//$post = array('epg_zip' => new CurlFile($file));
$post = array('epg_zip' => '@' . $file);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout in seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'abvjjlk: xxxxxxxxxxx',
'authorization: xxxxxxxxxxx'
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec($ch);
//curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if ($info['http_code'] == 200) {
logging("INFO", $file . ":" . $result);
return $result;
} else {
logging("ERROR", $result);
return FALSE;
}
}
function logging($type, $message) {
$logFileName = '/home/customscript/epg/logs/' . date('Y-m-d') . ".log";
$message = date('Y-m-d H:i:s') . '|' . $type . '|' . $message . PHP_EOL;
error_log($message, 3, $logFileName);
}