Форумы портала PHP.SU » » XML и его обработка » Перегнать XML в PHP

Страниц (1): [1]
 

1. vik7878 - 09 Декабря, 2017 - 15:06:43 - перейти к сообщению
Доброго дня. Возникла необходимость обновлять БД через XML файл.
Файл обновляется каждые 3 часа. А значит и БД тоже должна так обновляться. XML большой 250 мегабайт.

Нашел в инете такойкод
PHP:
скопировать код в буфер обмена
  1. $filename1 = 'file/price3.xml';
  2.                 ConnectDB();
  3.                 $elements   = null;  // просто имя текущей ноды
  4.                 $offer = null; // собирает один элемент offer
  5.                 $mysqli->query("DELETE FROM offer_");
  6.                 $mysqli->query("ALTER TABLE offer_ AUTO_INCREMENT=0");
  7.                 // Вызывается, когда встречается открывающий тег.
  8.                 // если это offer - создаем массив под него
  9.                 function startElements($parser, $name, $attrs)  
  10.                 {
  11.                         global $offer, $elements;
  12.                         if ($name == 'OFFER') {//category
  13.                         $offer = array();
  14.                         }
  15.                         $elements = $name;
  16.                 }
  17.  
  18.                 // Вызывается, когда тег закрывается
  19.                 // если это тег offer - печатаем содержимое и вычищаем
  20.                 function endElements($parser, $name)
  21.                 {
  22.                         global $offer, $elements;
  23.                         global $mysqli;
  24.                                
  25.                         if(!empty($name)) {
  26.                                 if ($name == 'OFFER') {
  27.                                         $oUid= "$offer[UID]";
  28.                                         $oUrl= "$offer[URL]";                  
  29.                                        
  30.                                                
  31.                                         $mysqli->query("INSERT INTO offer_ (Uid_, Url_) VALUES ($oUid, '$oUrl')");
  32.                                        
  33.                                         $offer = null;
  34.                                 }
  35.                                 $elements = null;
  36.                         }
  37.                 }
  38.  
  39.                 // Вызывается для текста, заполняем массив
  40.                 function characterData($parser, $data)
  41.                 {
  42.                         global $offer, $elements;
  43.                         if(!empty($data)) {
  44.                                 if ($elements == 'UID'   || $elements == 'URL'  ) {
  45.                                         $offer[$elements] = trim($data);
  46.                                 }
  47.                         }
  48.                 }
  49.  
  50.                 // Собственно, подготавливаем парсер
  51.                
  52.                 $parser = xml_parser_create();
  53.  
  54.                 xml_set_element_handler($parser, "startElements", "endElements");
  55.                 xml_set_character_data_handler($parser, "characterData");
  56.  
  57.                 // открываем файл
  58.                 if (!($handle = fopen($filename1, "r"))) {
  59.                         die("could not open XML input");
  60.                 }
  61.  
  62.                 while($data = fread($handle, 4096)) // читаем по кусочкам
  63.                 {
  64.                         xml_parse($parser, $data);  // и стравливаем парсеру
  65.                 }
  66.  
  67.                 xml_parser_free($parser); // почистим за собой.
  68.                 closeDB();
  69.  

Вот пример XML
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <offer id="12">
  3.     <uid>1234</uid>
  4.     <url>jhgjhgjhg</url>
  5. </offer>
  6. <offer id="13">
  7.     <url>hjgujgjg</url>
  8.     <uid>12345</uid>
  9. </offer>
  10.  

Все хорошо работает загрузка БД проходит менее чем за 2 мин.
Но у меня есть 2 вопроса:
1. Почему нужно в PHP писать теги (offer, uid, url) заглавными буквами. Иначе просто не работает.
2. Как вытащить id.
2. Мелкий - 09 Декабря, 2017 - 16:41:03 - перейти к сообщению
vik7878 пишет:
$mysqli->query("DELETE FROM offer_");
$mysqli->query("ALTER TABLE offer_ AUTO_INCREMENT=0");

Кошмар какой. truncate, простой быстрый truncate

vik7878 пишет:
Почему нужно в PHP писать теги (offer, uid, url) заглавными буквами

Потому что нужно читать мануал к используемым функциям, там это написано.
Цитата:
If case-folding is in effect for this parser, the element name will be in uppercase letters.

Дефолтно эта настройка включена.

vik7878 пишет:
Как вытащить id.

Вот не поверите! И об этом в мануале сказано!
Массив атрибутов передаётся третьим параметром функции обратного вызова start_element_handler

И хватит уже смешивать SQL-запросы и данные в них. 2017 год уже заканчивается, ну правда.
3. vik7878 - 09 Декабря, 2017 - 17:31:17 - перейти к сообщению
МелкийОчень прошу покажите как вытащить id. Не могу ни как понять
4. Мелкий - 09 Декабря, 2017 - 18:21:11 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. if ($name == 'OFFER') {
  2.      var_dump($attrs['ID']);
5. vik7878 - 12 Декабря, 2017 - 16:54:53 - перейти к сообщению
спасибо

 

Powered by ExBB FM 1.0 RC1