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