Вход • Регистрация

XML->ARRAY

  • 13 августа 2019 г.
  • Привет!

    Кто знает, как правильно разобрать 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++;
    }
    }
    }


    Что я делаю не так?
    • 13 августа 2019 г.
    • Вроде как ты остаешься на глубине корневого узла

      допустим <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')
      {


      }



      но это не точно
      • 13 августа 2019 г.
      • проблема в том, что с одни параметром работает, а с более одного нет.

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

        то выведет
        Код
        price, purchase_price, categoryId,picture ...
        • 13 августа 2019 г.
        • Может так прокатит? С SimpleXMLElement внутри итераций проще будет.

          Цитата

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

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум