Ответы пользователя по тегу Yii
  • Как правильно парсить большие XML используя консоль?

    @topalek
    данный код используется для чтения выгрузок товаров типа HOTLINE или Yandex

    /**
         * Parsing xml file according to $key_node
         *
         * @param      $key_node
         * @param null $filePath
         *
         * @return array|bool
         */
        public function parseXml($key_node, $filePath = null)
        {
    
            try {
                $output = [];
                $DOMDocument = new DOMDocument();
                $reader = new XMLReader();
                $reader->open($filePath);
                $line = 0;
                while (($read = $reader->read()) && $reader->name !== $key_node) {
                    $line++;
                }
                if (!$read) {
                    $text = "Не возможно прочитать xml файл - {$filePath}<br>";
                    $text .= "Элемент - {$key_node}  отсутствует в файле<br>";
                    $this->importErrorText = $text;
                    return $output = [];
                }
                $i = 0;
                while ($reader->name === $key_node) {
                    try {
                        $expanded = $reader->expand();
                    } catch (Exception $e) {
                        $this->readImportFileErrors[] = $e->getMessage();
                        try {
                            $reader->next($key_node);
                        } catch (Exception $e) {
                            $this->readImportFileErrors[] = $e->getMessage();
                        }
                    }
                    if (isset($expanded) && $expanded) {
                        if ($expanded->attributes) {
                            $dom = simplexml_import_dom($DOMDocument->importNode($expanded, true));
                            foreach ($dom->attributes() as $k => $v) {
                                $fieldName = mb_convert_encoding(trim($k), 'utf-8');
    
                                $output[$i][$fieldName] = mb_convert_encoding(trim((string)$v),
                                    'utf-8');
                                $output[$i]['title'] = mb_convert_encoding(trim((string)$expanded->nodeValue), 'utf-8');
                            };
                        }
    
                        foreach ($expanded->childNodes as $k => $item) {
                            if ($item->nodeType == 1) {
                                if ($item->attributes->length > 0) {
                                    foreach ($item->attributes as $prop) {
                                        if ((string)$prop->nodeValue) {
                                            $fieldName = trim((string)$item->nodeName);
    
                                            $output[$i][$fieldName][trim((string)$prop->nodeValue)] = mb_convert_encoding(trim((string)$item->nodeValue),
                                                'utf-8');
                                        }
                                    }
                                } else {
                                    $nodeName = trim((string)$item->nodeName);
    
                                    if (in_array($nodeName, ['picture', 'image'])) {
                                        $output[$i]['image'][] = mb_convert_encoding(trim((string)$item->nodeValue),
                                            'utf-8');
                                    } else {
                                        $output[$i][$nodeName] = mb_convert_encoding(trim((string)$item->nodeValue),
                                            'utf-8');
                                    }
                                }
                            }
                        }
    
                        if (!isset($output[$i]['code']) && !isset($output[$i]['vendorCode']) && !isset($output[$i]['barcode'])) {
                            $article = ArrayHelper::getValue($output[$i], 'param.Артикул');
                            if ($article) {
                                $output[$i]['article'] = $article;
                            }
                        }
                    }
                    try {
                        $reader->next($key_node);
                    } catch (Exception $e) {
                        $this->readImportFileErrors[] = $e->getMessage();
                    }
                    $i++;
    
                }
                return $output;
            } catch (Exception $exception) {
                $this->importErrorText = 'Ошибка чтения  файла';
                return [];
            }
        }
    Ответ написан