Загрузить большой xml

12
J
На сайте с 08.06.2006
Offline
844
920

есть большой xml на 837 000 записей (увеличивал память до 1024 на вдс - не помогло)

как бы его обуздать?

tommy-gung
На сайте с 22.11.2006
Offline
304
#1

куда, как, чем загрузить?

837 записей - ни о чем

Здесь не могла быть ваша реклама
J
На сайте с 08.06.2006
Offline
844
#2
tommy-gung:
куда, как, чем загрузить?

837 записей - ни о чем

в бд

скриптом пхп используя SimpleXML

837 тысяч записей

K0
На сайте с 01.09.2016
Offline
72
#3
joost:
как бы его обуздать?

Не использовать средства, которые будут пытаться грузить его целиком в память.

Сам я с большими xml на php не работал, но беглый гуглеж выдает вот такой пример: Парсинг XML с помощью XMLReader на PHP

tommy-gung
На сайте с 22.11.2006
Offline
304
#4

сколько весит?

Евгений Русаченко
На сайте с 17.04.2013
Offline
157
#5

Использую http://php.net/manual/ru/function.simplexml-load-string.php для разбора XML файлов около 30-50 мегабайт на 1 млн элементов с 10-15 атрибутами у большинства элементов. Проблем нет, PHP 5.6, лимит памяти 256-512 мегабайт.

Можно взглянуть на код разбора XML? Какой размер XML файла?

Почта для домена ( https://lite.host/pochta/dlya-domena ) с безлимитными пользователями и доменами / Хостинг ( https://lite.host/hosting/dlya-blogov ) от 99 рублей / поддержка Let's Encrypt / PHP от 5.2 до 8.3 / SSH / бесплатный перенос,
J
На сайте с 08.06.2006
Offline
844
#6
tommy-gung:
сколько весит?

под 300 метров

tommy-gung
На сайте с 22.11.2006
Offline
304
#7
joost:
под 300 метров

странно, с таким и simplexml без проблем справлялся

---------- Добавлено 27.12.2016 в 11:40 ----------

какая ошибка?

J
На сайте с 08.06.2006
Offline
844
#8
tommy-gung:
какая ошибка?

сначала писало, что памяти не хватает

увеличил

начало что-то другое писать

уже не помню

начал с XMLReader переписывать

---------- Добавлено 27.12.2016 в 14:30 ----------

Контент

<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>

while($reader->read()) {


if($reader->nodeType == XMLReader::ELEMENT) {

if($reader->localName == 'offer') {
$k++;

$data[$k]['id'] = $reader->getAttribute('id');

}

}

if($reader->localName == 'article') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['article'] = $reader->value;
}

}

while ($reader->localName == 'param') {
$reader->read();
if($reader->nodeType == XMLReader::ELEMENT) {
$data[$k]['param'].= $reader->getAttribute('name')."!";

}
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['param'].= ":".$reader->value."|";
}
}
if ($k==10) break;
}


print_r($data);

Результат

[1] => Array
(
[id] => O13121909413
[article] => 879200102010
[param] => :Мужской|Цвет!:меланж|Размер!:L/6|!
)

Не берет первого атрибута

Не видит его

Не понимаю почему

J
На сайте с 08.06.2006
Offline
844
#9

while ($reader->localName == 'param') {

$reader->read();

после while $reader->read(); не нужно

J
На сайте с 08.06.2006
Offline
844
#10

Что то не то

 while($reader->read()) {


if($reader->nodeType == XMLReader::ELEMENT) {

if($reader->localName == 'offer') {
$k++;

$data[$k]['id'] = $reader->getAttribute('id');

}

}

if($reader->localName == 'article') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['article'] = $reader->value;
}

}

if($reader->localName == 'categoryId') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['categoryId'] = $reader->value;
}

}


if($reader->localName == 'currencyId') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['currencyId'] = $reader->value;
}

}


if($reader->localName == 'description') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['description'] = $reader->value;
}

}

if($reader->localName == 'model') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['model'] = $reader->value;
}

}


if($reader->localName == 'name') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['name'] = $reader->value;
}

}


if($reader->localName == 'oldprice') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['oldprice'] = $reader->value;
}

}

while ($reader->localName == 'param') {

if($reader->nodeType == XMLReader::ELEMENT) {
$data[$k]['param'].= "*".$reader->getAttribute('name').":";
}
$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['param'].= $reader->value."";
}
}

if($reader->localName == 'picture') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['picture'] = $reader->value;
}

}


if($reader->localName == 'price') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['price'] = $reader->value;
}

}


if($reader->localName == 'url') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['url'] = $reader->value;
}

}

if($reader->localName == 'vendor') {

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$data[$k]['vendor'] = $reader->value;
}

}
if (count($data[$k])>=11) print $k."-".$data[$k]['id']."\n";
if ($k==12) break;

}

Выдает


1-0247453
1-0247453
1-0247453
1-0247453
1-0247453
1-0247453
2-0680064
2-0680064
2-0680064
2-0680064
2-0680064
2-0680064
3-0852793
3-0852793
3-0852793
3-0852793
3-0852793
3-0852793
3-0852793
4-0854905
4-0854905
4-0854905
4-0854905
4-0854905
4-0854905
4-0854905
5-0872678
5-0872678
5-0872678
5-0872678
5-0872678
5-0872678
6-0919188
6-0919188
6-0919188
6-0919188
6-0919188
6-0919188
6-0919188
7-0953103
7-0953103
7-0953103
7-0953103
7-0953103
7-0953103
7-0953103
8-0967998
8-0967998
8-0967998
8-0967998
8-0967998
8-0967998
8-0967998
9-0982546
9-0982546
9-0982546
9-0982546
9-0982546
9-0982546
9-0982546
10-1418332
10-1418332
10-1418332
10-1418332
10-1418332
10-1418332
10-1418332
11-1812662
11-1812662
11-1812662
11-1812662
11-1812662
11-1812662
11-1812662

по 7 раз один и тот же элемент "видит"

Что не так?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий