Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Форум Сайт на DIAFAN.CMS Программирование на DIAFAN.CMS XML->ARRAY


Александр (capitan) 10913 августа

Привет!

Кто знает, как правильно разобрать xml в массив

Код
<offer id="5270" available="true">
<price>197</price>
<purchase_price>152.77</purchase_price>
<currencyId>RUR</currencyId>
<categoryId>1019</categoryId>
<market_category>Спорт и отдых/Водный спорт/Аксессуары для плавания</market_category>
<picture>/kiwi-public-data/Kiwi_Img/int59703.png</picture>
<store>false</store>
<pickup>true</pickup>
<delivery>true</delivery>

Показать весь код
<delivery-options><option cost="0" days="2-4" order-before="13"/></delivery-options>
<name>Надувной глянцевый матрац</name>
<vendor>Intex</vendor>
<vendorCode>59703</vendorCode>
<description>Прочный яркий матрас</description>
<param name="guiding_available_quantity">29</param>
<param name="guiding_buy_price">152.77</param>
<param name="guiding_base_price">190.96</param>
<param name="Возраст от" unit="лет">6</param>
<param name="Материал">ПВХ.</param>
<barcode>78257597031</barcode>
<param name="Цвет">желтый</param>
<param name="Цвет">голубой</param>
<param name="Цвет">розовый</param>
<param name="Цвет">оранжевый</param>
<param name="Цвет">зеленый</param>
<manufacturer_warranty>true</manufacturer_warranty>
<sales_notes>Наличные. Банковские карты.</sales_notes>
<param name="nn">479</param>
</offer>


Таких 50.000 товаров

Если делаю вот так,

Код
$reader = new XMLReader();
$offers_arr = array();
$offers_sort = 0;

while ($reader->read()) {
if($reader->name == 'offer'){
$offers = array();
$offer_id = $reader->getAttribute('id');
$offers[$offers_sort]['id'] = $offer_id;
while ($reader->read() {

Показать весь код
/***********************************************************/
if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'price')) {
$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$offers[$offers_sort]['price'] = $reader->value;
array_push($offers_arr, $offers);
}
}
$offers_sort++;
}
}
}


Пример выше работает, но если пытаюсь добавить как минимум одно еще одно значение, то перестает работать

Код
$reader = new XMLReader();
$offers_arr = array();
$offers_sort = 0;

while ($reader->read()) {
if($reader->name == 'offer'){
$offers = array();
$offer_id = $reader->getAttribute('id');
$offers[$offers_sort]['id'] = $offer_id;
while ($reader->read() {

Показать весь код
/***********************************************************/
if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'price')) {
$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$offers[$offers_sort]['price'] = $reader->value;
array_push($offers_arr, $offers);
}
}
/***********************************************************/
if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->localName == 'purchase_price')) {
$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
$offers[$offers_sort]['purchase_price'] = $reader->value;
array_push($offers_arr, $offers);
}
}
$offers_sort++;
}
}
}


Что я делаю не так?

Андрей (R4W) 9513 августа

Вроде как ты остаешься на глубине корневого узла

допустим <offer id="5270" available="true"> лежит внутри <offers>

Код


$reader = new XMLReader();
$offers_arr = array();
$offers_sort = 0;

while ($reader->read() && $reader->name !== 'offers');

while ($reader->name === 'offer')
{

Показать весь код


}



но это не точно

Александр (capitan) 10913 августа

проблема в том, что с одни параметром работает, а с более одного нет.

Хотя если прописать типа этого
Код
while ($reader->read()) {
if($reader->nodeType == XMLReader::ELEMENT) {
echo $reader->localName . ',';
}
}

то выведет
Код
price, purchase_price, categoryId,picture ...

Андрей (R4W) 9513 августа

Может так прокатит? С SimpleXMLElement внутри итераций проще будет.

Цитата

while ($reader->name === 'offer')
{
$node = new SimpleXMLElement($reader->readOuterXML());
var_dump($node);
$reader->next('product');
}