Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Разбор XML для импорта в базу - нужна помощь
Форумы портала PHP.SU » » XML и его обработка » Разбор XML для импорта в базу - нужна помощь

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

1. vesga - 26 Мая, 2012 - 19:27:00 - перейти к сообщению
Здравствуйте!
Разбираю XML для импорта в базу myscl.
CODE (html):
скопировать код в буфер обмена
  1. <offer type="vendor.model" id="330784" available="true">
  2. <url>http://pay.ru/click/</url>
  3. <price>2890.00</price>
  4. <currencyId>RUB</currencyId>
  5. <categoryId>451</categoryId>
  6. <picture>http://ato.ru/upload/iblock/080/750x1000_ut000011040_1.jpg</picture>
  7. </offer>

С помощью кода ниже всё делалось замечательно.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.         $file = "yml.xml";
  4.  
  5.         header('Content-type: text/html; charset=utf-8');
  6.         set_time_limit(0);
  7.         require_once ('connect.php');
  8.  
  9.         $state='';
  10.         $sub_state='';
  11.         $arr_item=array();
  12.  
  13.         $xml_parser = xml_parser_create('UTF-8');
  14.         xml_set_element_handler($xml_parser, "startElement", "endElement");
  15.         xml_set_character_data_handler($xml_parser, "characterData");
  16.        
  17.         $fp = fopen($file, "r");
  18.  
  19.         while ($data = fread($fp, 4096))
  20.         {
  21.                 xml_parse($xml_parser, $data, feof($fp));
  22.         }
  23.  
  24.         xml_parser_free($xml_parser);
  25.  
  26.         function startElement($parser, $name, $attrs)
  27.         {
  28.                 global $state; global $sub_state;
  29.                
  30.                 if ($name=='OFFER')
  31.                 {
  32.                         $state='offer';
  33.                         $sub_state='';
  34.                         return;
  35.                 }
  36.                
  37.                 if ($state=='offer')
  38.                 {
  39.                         $sub_state=$name;
  40.                 }
  41.                 else
  42.                 {
  43.                         $sub_state='';
  44.                 }
  45.         }
  46.  
  47.         function endElement($parser, $name)
  48.         {
  49.                 global $arr_item;
  50.                 if ($name=='OFFER')
  51.                 {
  52.                         $state='';
  53.                         if (count($arr_item)>0)
  54.                         {
  55.                                 process_item();
  56.                         }      
  57.                 }
  58.         }
  59.  
  60.         function characterData($parser, $data)
  61.         {
  62.                 global $sub_state; global $arr_item;
  63.                 if (in_array($sub_state, array('URL', 'PRICE', 'CURRENCYID', 'CATEGORYID', 'PICTURE', 'TYPEPREFIX', 'VENDOR', 'MODEL')))
  64.                 {
  65.                         if (strlen(trim(str_replace ("\n", '', $data)))>0)
  66.                         {
  67.                                 $arr_item[$sub_state].=$data;
  68.                         }
  69.                 }
  70.         }
  71.         function _str($s)
  72.         {
  73.                 return trim(mysql_real_escape_string($s));
  74.         }
  75.         function process_item()
  76.         {
  77.                 global $arr_item;
  78.                
  79.                 $sql="insert into jos_sap (url, price, currencyId, categoryId, picture, typePrefix, vendor, model, date_add, update_date) values ('"._str($arr_item['URL'])."', '"._str($arr_item['PRICE'])."', '"._str($arr_item['CURRENCYID'])."', '"._str($arr_item['CATEGORYID'])."', '"._str($arr_item['PICTURE'])."', '"._str($arr_item['TYPEPREFIX'])."', '"._str($arr_item['VENDOR'])."', '"._str($arr_item['MODEL'])."', NOW(), NOW())";
  80.                 file_put_contents ('2.sql', $sql.";\n", FILE_APPEND);
  81.                 $arr_item=array();
  82.         }
  83. ?>

С недавних пор XML изменился на следующий.
CODE (html):
скопировать код в буфер обмена
  1. <offer type="vendor.model" id="330784" available="true">
  2. <url>http://pay.ru/click/</url>
  3. <price>2890.00</price>
  4. <currencyId>RUB</currencyId>
  5. <categoryId>451</categoryId>
  6. <picture>http://ato.ru/upload/iblock/080/750x1000_ut000011040_1.jpg</picture>
  7. <picture>http://ato.ru/upload/iblock/23f/750x1000_ut000011040_2.jpg</picture>
  8. <picture>http://ato.ru/upload/iblock/0f7/750x1000_ut000011040_3.jpg</picture>
  9. <picture>http://ato.ru/upload/iblock/cb0/750x1000_ut000011040_4.jpg</picture>
  10. <picture>http://ato.ru/upload/iblock/a4a/750x1000_ut000011040_5.jpg</picture>
  11. <picture>http://ato.ru/upload/iblock/824/750x1000_ut000011040_6.jpg</picture>
  12. <picture>http://ato.ru/upload/iblock/772/750x1000_ut000011040_7.jpg</picture>
  13. </offer>

Все <picture> пишутся в одну ячейку таблицы, что правильно с точки зрения кода, но совершенно не совпадает с поставленной задачей. Сам в PHP не разбираюсь никак, поэтому сильно прошу помочь в изменении кода, чтобы все <picture> писались в свои ячейки базы данных, либо подскажите в какую сторону копать и что надо в коде менять.
2. vesga - 05 Июня, 2012 - 16:27:27 - перейти к сообщению
Задача поменялась. Требуется из тега <offer> извлечь в базу данных атрибут id. За реальную помощь готов заплатить.
3. Kreks - 07 Июня, 2012 - 23:27:11 - перейти к сообщению
vesga пишет:
Задача поменялась. Требуется из тега <offer> извлечь в базу данных атрибут id. За реальную помощь готов заплатить.


Может уже поздно, но все же
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <offer type="vendor.model" id="330784" available="true">
  4.     <url>http://pay.ru/click/</url>
  5.     <price>2890.00</price>
  6.     <currencyId>RUB</currencyId>
  7.     <categoryId>451</categoryId>
  8.     <picture>http://ato.ru/upload/iblock/080/750x1000_ut000011040_1.jpg</picture>
  9.  </offer>
  10.  


Парсим

PHP:
скопировать код в буфер обмена
  1.  
  2. $sxml = simplexml_load_file("Maza.xml");   //Интерпретирует XML-файл в объект
  3. $offer = $sxml->xPath("/offer[@id]");
  4. print_r($offer); # Выведет все
  5. //print_r ($offer[0]["id"]); # Массив с ID
  6.  

 

Powered by ExBB FM 1.0 RC1