powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / погите разобрать с XMLReader
4 сообщений из 4, страница 1 из 1
погите разобрать с XMLReader
    #38376110
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день .

Уже второй день бьюсь чтобы понять как работает этот XMLReader.

задача в принципе элементарная :
есть XML его надо влить в таблицы mysql. Сложность в том что XML гигантская.

SimpleXMLElement - даже и не советуйте. XML очень большой и не справляется сервак с огромным по объёму объектом SimpleXMLElement , поэтому необходим поточный XMLReader.

Вот XML :
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2013-08-16 03:32">

<shop>
<name>SotMarket.ru</name>
<company>SotMarket</company>
<url>http://www.sotmarket.ru/</url>

<currencies>
<currency id="RUR" rate="1"/>
</currencies>
<categories>
<category id="2485" parentId="2483">Дозиметры</category>
<category id="2487" parentId="2483">Экотестеры</category>
</categories>
<offers>

  <offer id="802" available="true">
    <url>http://www.sotmarket.ru/product/data_cable_usb_alcatle_835.html</url>
    <price>50</price>
    <currencyId>RUR</currencyId>
    <categoryId>1</categoryId>
    <name>USB дата-кабель для Alcatel OneTouch 835 + CD</name>
    <brand>Alcatel</brand>
    <description>Подумайте - используете ли вы в полной мере возможности вашего мобильного телефона? Все ли функции достаточно удобны?      Универсальный USB-кабель для телефона Alcatel 835 поможет вам использовать ваш мобильный телефон на 100%, подключив его к персональному компьютеру. Только так вы сможете узнать, что такое настоящее удобство. Забудьте про маленькие неудобные кнопки. Подключившись к компьютеру, вы можете пользоваться всеми функциями, предлагаемые вашим мобильным телефоном, в самых комфортных условиях: удобное программное обеспечение позволяет легко загружать картинки и мелодии, работать с записной книжкой. А главное - вам не надо больше платить за дорогостоящие SMS-сервисы: если цена мелодии или логотипа по SMS составляет около доллара, то за те же деньги вы можете закачать cебе несколько десятков мегабайт картинок и мелодий!

CD: В комплекте с кабелем поставляется CD с драйвером USB порта
     </description>
  </offer>

 <offer id="2692" available="true">
     <url>http://www.sotmarket.ru/product/data_cable_z300.html</url>
     <price>90</price>
     <oldprice>321</oldprice>
     <currencyId>RUR</currencyId>
     <categoryId>1</categoryId>
     <picture>http://img.sotmarket.ru/standart/img/product/sam_big.gif</picture>
     <picture>http://img.sotmarket.ru/img/product/sam_big.gif</picture>
     <name>USB дата-кабель для Samsung Z300 + CD</name>
     <brand>Samsung</brand>
     <description>Подумайте - используете ли вы в полной мере возможности вашего мобильного телефона? Все ли функции достаточно удобны? Универсальный USB-кабель для телефона Samsung Z300 поможет вам использовать ваш мобильный телефон на 100%, подключив его к персональному компьютеру. Только так вы сможете узнать, что такое настоящее удобство. Забудьте про маленькие неудобные кнопки. Подключившись к компьютеру, вы можете пользоваться всеми функциями, предлагаемые вашим мобильным телефоном, в самых комфортных условиях: удобное программное обеспечение позволяет легко загружать картинки и мелодии, работать с записной книжкой. А главное - вам не надо больше платить за дорогостоящие SMS-сервисы: если цена мелодии или логотипа по SMS составляет около доллара, то за те же деньги вы можете закачать cебе несколько десятков мегабайт картинок и мелодий! CD: В комплекте с кабелем поставляется CD с драйвером USB порта
     </description>
   </offer>
</offers>
</shop>
</yml_catalog>




надо офферы <offer> вливать в базу в табличку
(id,
available,
url,
price,
old_price,
currencyId,
categoryId,
picture,
picture,
name,
brand,
description
)

причём id и available это атрибуты , как вы можете заметить из XML, а всё остальное элементы
и ещё old_price иногда может отсутствовать в "наборе" <offer>, а элемент picture может присутствовать 2 раза в том же наборе.


хотя бы вывести мне надо так , в базу выведу сам:
id=123456
available = true
url='www.mysite1.com'
...

id=654132
available = true
url='www.mysite2.com'
...

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
$reader = new XMLReader();
$reader->open("tovari_full_.xml");
$i=0;
while ($reader->read()) {
 if (($reader->nodeType == XMLReader::ELEMENT) //зашёл между 
   && ($reader->name == 'offers')) {           //<offers> </offers>
  while ($reader->read()) {                 //хожу тут циклом

 if (($reader->nodeType == XMLReader::ELEMENT) //зашёл в
   && ($reader->name == 'offer')) {           //<offer> 
  while ($reader->read()) {                 //хожу тут циклом
   echo ($reader->getAttribute('id'));      //вывожу атрибут id
    if ($reader->name == 'url') {echo ('url='.$reader->value.'<br>');}
    if ($reader->name == 'price') {echo ('price='.$reader->value.'<br>');}

    if ($reader->nodeType == XMLReader::END_ELEMENT //если конец элемента offer 
       && $reader->name == "offer") {               //выходим из вложенного цикла
      
        break;
    }
}
 }
}
}}



выводит лажу какую - то . видимо совсем у меня нет понятия как это работает
...
Рейтинг: 0 / 0
погите разобрать с XMLReader
    #38377124
mhx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mhx
Гость
http://www.php.net/manual/ru/intro.xmlreader.php Кодировка
Важно отметить, что библиотека libxml внутри использует кодировку UTF-8 и, таким образом, кодировка извлекаемого содержимого всегда будет в кодировке UTF-8.

Не?
...
Рейтинг: 0 / 0
погите разобрать с XMLReader
    #38377473
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mhx http://www.php.net/manual/ru/intro.xmlreader.php Кодировка
Важно отметить, что библиотека libxml внутри использует кодировку UTF-8 и, таким образом, кодировка извлекаемого содержимого всегда будет в кодировке UTF-8.

Не?

тоже отваливает перегрузку сервака словно я использую SimpleXML. Ошибка - перерасход памяти.
...
Рейтинг: 0 / 0
погите разобрать с XMLReader
    #38377598
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
использовал я вашу ссылочку , даже модифицировал - делаю unset($book).
Сервак затыкается - ошибка 500


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
function callback($array){
    //condition and action for positive validation (increments parser limit)
    if($array['info1']!="Out Of Stock"){
        /*add to database*/
        return TRUE;
    }
    else {
        return FALSE;
    }
}
function xmlParse($file,$wrapperName,$callback,$limit=NULL){
 global $db;

//     echo('test12345');
$db->query("delete from affiliate_products_of_shops", array());


    $xml = new XMLReader();
    if(!$xml->open($file)){
        die("Failed to open input file.");
    }
    $n=0;
    $x=0;
    while($xml->read()){
        if($xml->nodeType==XMLReader::ELEMENT && $xml->name == $wrapperName){
                unset($book);
                         $book['id']= $xml->getAttribute('id');
                         $book['available']= $xml->getAttribute('available');

            while($xml->read() && $xml->name != $wrapperName){
                if($xml->nodeType==XMLReader::ELEMENT){
                    $name = $xml->name;
                    $xml->read();
                    $value = $xml->value;
                      //echo $value.'<br>';
                        $book[$name] = $value;
//  echo($book['id'].'<br>');
$is_exists =  $db->getOne("SELECT (case when exists(select '1' from affiliate_products_of_shops where offer_id=? and shop_id=?) then 1 else 0 end) as QTY", 
               array($book['id'],$_GET['shop_id'])); 

if ($is_exists==0) {
$db->query("insert into affiliate_products_of_shops 
(offer_id,available,shop_id,URL,price,old_price,currencyId,
categoryId,pic0,pic1,name,brand,description
) VALUE(?,?,?,?,?,?,?,?,?,?,?,?,?)", array(
$book['id'], 
$book['available'],
$_GET['shop_id'],
$book['url'],
$book['price'],
$book['oldprice'],
$book['categoryId'],
$book['url'],
$book['picture'],
null,
$book['name'],
$book['brand'],
$book['description'])); 

} else {

$db->query("update affiliate_products_of_shops  set 
available=?,URL=?,price=?,old_price=?,currencyId=?,
categoryId=?,pic0=?,pic1=?,name=?,brand=?,description=?
 where shop_id = ? and offer_id=?", 
array( 
$book['available'],
$book['url'],
$book['price'],
$book['oldprice'],
$book['currencyId'],
$book['categoryId'],
$book['picture'],
null,
$book['name'],
$book['brand'],
$book['description'],
$_GET['shop_id'],
$book['id']
));

}





/*                    if(preg_match("/[^\s]/",$value)){

                    } */
                }
            }
            if($limit==NULL || $x<$limit){
                if($callback($book)){
                    $x++;

                }
                unset($book);
            }
            $n++;
        }
    }
    $xml->close();
return $book;
}



 echo('<pre>');
 xmlParse('tovari_full_.xml','offer','callback',5);
 echo('</pre>');


?>
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / погите разобрать с XMLReader
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]