Advertisement
djyarik

// парсилка xml выгрузки gdeslon 08.10.2016 в базу SQLite

Oct 8th, 2016
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.17 KB | None | 0 0
  1. <?
  2. // парсилка xml выгрузки gdeslon в базу SQLite
  3. // © skray 08.10.2016
  4. Error_Reporting(E_ALL);
  5. ini_set('display_errors', TRUE);
  6. @ini_set('memory_limit', '512M');
  7. @set_time_limit(0);
  8. @ini_set('max_execution_time',0);
  9. @ini_set('set_time_limit',0);
  10. @ob_end_flush();
  11. $start_time = microtime(true);
  12. $g=0;
  13. $_db="data/slonxml.db";  // название будущей базы // папка data в данном примере должна уже быть создана
  14. $_xml="slon.xml";  // xml файл, который нужно распарсить
  15. $xml_td=array("id", "_id", "merchant_id", "gs_product_key", "article", "gs_category_id", "original_picture", "name", "description", "vendor", "model", "url", "price", "categoryid", "param");
  16. $cat_td=array("id", "_id","parent_id","name");
  17.  
  18. function ar($ar,$at)
  19. {
  20.     $zip=preg_replace("/(.*)$at$/",'\1',$ar);
  21.     $zip=explode($at,$zip);
  22.     return $zip;
  23. }
  24.  
  25. function str($ar,$at)
  26. {
  27.     $zip=preg_replace("/(.*)$at$/",'\1',$ar);
  28.     return $zip;
  29. }
  30.  
  31. function kv($ssl)
  32. {
  33.     $ssl=preg_replace("/\"|\'/",'',$ssl);
  34.     return $ssl;
  35. }
  36.  
  37. function baza($xml_td,$cat_td)
  38. {
  39.     global $_db,$dbx;
  40.     if (!file_exists($_db))
  41.     {
  42.         $xml_list="";$cat_list="";
  43.         foreach($xml_td as $k) {$lis=$k=='id'?"INTEGER PRIMARY KEY":"TEXT";$xml_list.="$k $lis,";}
  44.         foreach($cat_td as $k) {$lis=$k=='id'?"INTEGER PRIMARY KEY":"TEXT";$cat_list.="$k $lis,";}
  45.         $xml_list=str($xml_list,",");$cat_list=str($cat_list,",");
  46.         $dbx = new SQLite3($_db);
  47.         $dbx->busyTimeout(5000);
  48.         $dbx->exec('PRAGMA journal_mode=WAL;');
  49.         $dbx->exec("CREATE TABLE IF NOT EXISTS cat ($cat_list);");
  50.         $dbx->exec("CREATE TABLE IF NOT EXISTS xml ($xml_list);");
  51.         $dbx->close();
  52.     }
  53.     $dbx = new SQLite3($_db);
  54.     $dbx->busyTimeout(5000);
  55.     $dbx->exec('PRAGMA journal_mode=WAL;');
  56. }
  57.  
  58. baza($xml_td,$cat_td);
  59. $x_id = array_shift($xml_td);
  60. $c_id = array_shift($cat_td);
  61. $reader = new XMLReader();
  62. $reader->open($_xml);
  63. $dbx->exec('BEGIN IMMEDIATE;');
  64.  
  65. while ($reader->read())
  66. {
  67.     if ($reader->nodeType == XMLREADER::ELEMENT&&$reader->localName == 'categories')
  68.     {
  69.         $category = new SimpleXMLElement($reader->readouterXML());
  70.         foreach($category as $lin)
  71.         {
  72.             $cats=$lin->attributes();
  73.             $cat="'".$cats['id']."','".$cats['parent_id']."','".$lin."'";
  74.             $dbx->exec("INSERT INTO cat (_id,parent_id,name) VALUES ($cat);");        
  75.         }
  76.     }      
  77.     if ($reader->nodeType == XMLREADER::ELEMENT&&$reader->localName == 'offer')
  78.     {
  79.         $offer = new SimpleXMLElement($reader->readouterXML());
  80.         $attr=$offer->attributes();
  81.         $params = $offer->param;      
  82.         $name= kv($offer->name);
  83.         $price= kv($offer->price);
  84.         $picture = $offer->picture;
  85.         $original_picture = $offer->original_picture;
  86.         $description = kv($offer->description);
  87.         $vendor = kv($offer->vendor);
  88.         $model = kv($offer->model);
  89.         $url = $offer->url;
  90.         $gs_category_id = $attr['gs_category_id'];
  91.         $merchant_id = $attr['merchant_id'];
  92.         $article=$attr['article'];
  93.         $gs_product_key=$attr['gs_product_key'];
  94.         $_id=$attr['id'];
  95.         $categoryid= $offer->categoryId;
  96.         $param1="";$param2="";
  97.         foreach ($params as $atr){$param1.=$atr['name']."~";$param2.=$atr."~";}
  98.         $param1=ar($param1,"~");$param2=ar($param2,"~");
  99.         $param=serialize(array_combine($param1,$param2));
  100.         $ntb="";$array="";
  101.         foreach($xml_td as $nm){$ntb.=$nm.",";$array.="'".$$nm."',";}
  102.         $ntb=str($ntb,",");$array=str($array,",");
  103.         $dbx->exec("INSERT INTO xml ($ntb) VALUES ($array);");
  104.         if($g/200==intval($g/200))
  105.         {
  106.             $dbx->exec('COMMIT;');
  107.             $dbx->exec('BEGIN IMMEDIATE;');
  108.         }              
  109.         $g++;                  
  110.     }
  111. }
  112.        
  113. $dbx->exec('COMMIT;');
  114. $dbx->close();
  115.  
  116. $exec_time = round(microtime(true) - $start_time, 3);
  117. $memory = round(memory_get_usage() / 1024, 3);
  118. echo "<br><hr><br>Загружено $g за $exec_time сек. | Memory: $memory Kb.";
  119.  
  120.  
  121. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement