[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: парсинг большого xml
дианитка
Здравствуйте, уважаемые форумчане. Подскажите, пожалуйста, по такому вопросу.
Есть большой xml файл весом 9Mb с 9000 товаров. Был написан скрипт парсинга такого файла с помощью SimpleXML. Скрипт должен запускаться по крону
2 раза в неделю. На одном хостинге скрипт работал, но приходили письма о том, что на сайте происходят процессы, кот нагружают сервер.
На другом хостинге скрипт перестал работать и когда его запускаешь вручную, то пишет Ошибка 504 Gateway Time-out.
Я решили переписать скрипт, использовав для парсинга другой метод - SAX парсер, т.к. прочитала, что SimpleXML сильно нагружает память.

В приложении структура xml и мой скрипт SAX парсера. При написании скрипта я просмотрела примеры и не нашла, как достать информацию
из более глубокого уровня вложенности - например, из rubriky или pics.Подскажите, пожалуйста, как это можно сделать. И еще: Для каждого товара вызываются функции addArticle, updateArticle и другие,
кот заносят в БД информацию о текущем товаре. Это правильный подход, что кажд товар по отдельности записывается сразу в БД или может быть
нужно прочитать файл, сформировать,например, массив из данных и потом делать запись в БД?




<?xml version="1.0" encoding="windows-1251"?>

<root>
<item>
<artikul>
10004900</artikul>
<name>
Женские дух L'atour</name>
<rubriky>
<rubr>
Каталог для женщин\Духи\Французские духи\</rubr>
</rubriky>
<color>
синий</color>
<vid>
цветная коробка</vid>
<ves>
0.216</ves>
<kol>
1</kol>
<opis></opis>
<price>
667.3</price>
<pics>
<small>
<pic>
10004900_a.jpg</pic>
<pic>
10004900_b.jpg</pic>
</small>

<big>
<pic>
10004900_d.jpg</pic>
<pic>
10004900_e.jpg</pic>
</big>
</pics>

<ostatok>
0</ostatok>
<razmer>
d85х245 мм</razmer>
<brand>
L'atour</brand>
<material>
пластик</material>
</item>


<item>
<artikul>
10004900</artikul>
<name>
Женские дух L'atour</name>
<rubiky>
<rubr>
Каталог для женщин\Духи\Французские духи\</rubr>
</rubriky>
<color>
синий</color>
<vid>
цветная коробка</vid>
<ves>
0.216</ves>
<kol>
1</kol>
<opis></opis>
<price>
667.3</price>
<pics>
<small>
<pic>
10004900_a.jpg</pic>
<pic>
10004900_b.jpg</pic>
</small>

<big>
<pic>
10004900_d.jpg</pic>
<pic>
10004900_e.jpg</pic>
</big>
</pics>

<ostatok>
0</ostatok>
<razmer>
d85х245 мм</razmer>
<brand>
L'atour</brand>
<material>
пластик</material>
</item>


<item>
<artikul>
10004900</artikul>
<name>
Женские дух L'atour</name>
<rubiky>
<rubr>
Каталог для женщин\Духи\Французские духи\</rubr>
</rubriky>
<color>
синий</color>
<vid>
цветная коробка</vid>
<ves>
0.216</ves>
<kol>
1</kol>
<opis></opis>
<price>
667.3</price>
<pics>
<small>
<pic>
10004900_a.jpg</pic>
<pic>
10004900_b.jpg</pic>
</small>

<big>
<pic>
10004900_d.jpg</pic>
<pic>
10004900_e.jpg</pic>
</big>
</pics>

<ostatok>
0</ostatok>
<razmer>
d85х245 мм</razmer>
<brand>
L'atour</brand>
<material>
пластик</material>
</item>


</root>









<?/* --------------------Чтение XML файла------------------------- */
$local_file = $_SERVER['DOCUMENT_ROOT']."/local.xml";
$conn=db_connect();
$insideitem=false;
$tag='';
$criterias=array();
$Artikul='';
$Name='';
$i=0;
$criteriasIds=getCriteriasIds($conn);


function startElement($parser,$name,$attrs){
global $insideitem,$tag,$criterias,$Artikul,$Name,$Price,$i,$conn,$criteriasIds;
if($insideitem){
$tag=$name;
}
elseif($name=="ITEM"){
$insideitem = true;
}

}


function endElement ($parser,$name){
global $insideitem,$tag,$criterias,$Artikul,$Name,$Price,$i,$conn,$criteriasIds;

if($name=="ITEM"){
$i++;
echo $i.'  ';
echo $insideitem;
echo $tag;
print_r($criterias);
echo $Artikul;
echo $Name;
echo $ShortDescription;
echo $Price;
$categoryID=10;

/*обновляем параметры товара по артикулу, предполагая что такой товар уже есть.*/
$check_update=updateArticle($Artikul,$Name,$categoryID,$Price,$conn);

/*если update не выполнился, значит такого товара нет - нужно его добавить.*/
if ($check_update==false){
$article_id=addArticle($Artikul,$Name,$categoryID,$Price,$conn);
addCriteriasValues($article_id,$criterias,$criteriasIds,$conn);
}

else{
$article_id = $check_update;
updateCriteriasValues($article_id,$criterias,$criteriasIds,$conn);
}

$insideitem = false;
}

}


function characterData($parser,$data){
global $insideitem,$tag,$criterias,$Artikul,$Name,$Price,$i,$conn,$criteriasIds;
if($insideitem){
switch ($tag){
case "ARTIKUL":
$Artikul=$data;
break;

case "NAME":
$Name=$data;
break;

case "COLOR":
$criterias['color']=$data;
break;

case "PRICE":
$Price=$data;
break;

case "VID":
$criterias['vid']=$data;
break;

case "VES":
$criterias['ves']=$data;
break;

case "KOL":
$criterias['kol']=$data;
break;

case "OSTATOK":
$criterias['ostatok']=$data;
break;

case "RAZMER":
$criterias['razmer']=$data;
break;

case "BRAND":
$criterias['brand']=$data;
break;


case "MATERIAL":
$criterias['material']=$data;
break;


}
}
}



//Создание парсера
$xml_parser=xml_parser_create();

//Задание функций-обработчиков

xml_set_element_handler($xml_parser,"startElement","endElement");
xml_set_character_data_handler($xml_parser,"characterData");

$fp=fopen($local_file,"r") or die('Error Reading');

while($data=fread($fp, filesize($local_file))){
//Вызов парсера для обработки данных из файла
xml_parse($xml_parser,$data,feof($fp))
or die (sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));
}
fclose($fp);
xml_parser_free($xml_parser);?>




_____________
дианка[COLOR=purple]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.