парсинг xml c вложенностью больше 2-x

308
19 октября 2017, 11:37

есть вот такое парсер (переделыватель) xml файла. Однако есть загвоздка, проходя по исходному xml он игнорирует категории 3 вложенности. скажите как подправить. сам в php не рублю, но что-то подсказывает что не очень сложно.

            <?
    // ГЛОБАЛЬНЫЕ ПУТИ ---------
    //$zip_path_orig = $_SERVER['DOCUMENT_ROOT']."/catalog";
    $zip_path = $_SERVER['DOCUMENT_ROOT']."/upload";
    $zip_name = "catalog.zip";
    $xml_path = $_SERVER['DOCUMENT_ROOT']."/upload";
    $xml_name_in = "catalog.xml";
    $xml_name_out = "elsis.xml";
    //echo "xml_path=".$xml_path;
    // -------------------------
    // переместить из корня в upload
    //rename($zip_path_orig."/".$zip_name,$zip_path.'/catalog.zip');

    //Создаём объект для работы с ZIP-архивами
    $zip = new ZipArchive();
      if ($zip->open($zip_path."/".$zip_name) === true)
    {
        $zip->extractTo($xml_path); //Извлекаем файлы в указанную директорию
        $zip->close(); //Завершаем работу с архивом
    // переименовываем zip-архив для истории
        rename($zip_path."/".$zip_name,$zip_path.'/catalog_'.date("Y-m-d_H-i").'.zip');
    // Доп. проверка на отсутствие catalog.zip в папке, если есть - удалить
    if (is_file($zip_path."/".$zip_name))
    {
        unlink($zip_path."/".$zip_name);
    }
    // загружаем xml в переменную
    $oXML = simplexml_load_file($xml_path."/".$xml_name_in);
    if($oXML->Документ)
        $obXML = $oXML->Документ;
    if($obXML->Группа)
    {
    $fp = fopen($xml_path."/".$xml_name_out, 'w'); // Открываем файл с перезаписью старого
    $s0 = "<Файл xsi=\"http://www.w3.org/2001/XMLSchema-instance\" noNamespaceSchemaLocation=\"NO_EDUPR_1_083_00_04_01_02.xsd\">";
    $s0.= "<Предприятие>ООО Триатрон</Предприятие><Название>Каталог товаров</Название>";
    $s0.= "<Документ>";
    $s1 = "<Номенклатура ";
        foreach($obXML->Группа as $group)
        {
    //  echo "<br>Группа:<br>";
        $s2 = "";
        foreach($group->attributes() as $name => $value)
            {
    //      echo $name."=".$value."<br>";
            if($name == "Название")
                $name = "НазваниеГруппы";
            $value = trim(htmlspecialchars(preg_replace('/ {2,}/',' ',$value)));
            $s2.= $name."=\"".$value."\" ";
    //      if($name == "КодГруппы")
    //      $s2.= "imageG=\"sections/img/".(int)$value.".jpg\" ";
        }

            $s3 = "КодПодГруппы=\"\" НазваниеПодГруппы=\"\" ";
            foreach($group->Номенклатура as $item)
            {
            $s4 = "";
    //      echo "<br>Номенклатура:<br>";
            foreach($item->attributes() as $name => $value)
                {
    //      echo $name."=".$value."<br>";
                if($name != "Характеристики" && $name != "КодКонтрагента")
                {
                $value = trim(htmlspecialchars(preg_replace('/ {2,}/',' ',$value)));
                if($name == "Наличие" && (strpos($value, '.') !== false || strpos($value, 'недел') !== false))
                {
                    $value = 0;
                }
                if ($value == 0)
                {
                    // 3-4 недели
                    $s11 = "Статус=\"9\" ";
                }
                else
                {
                    // В наличии
                    $s11 = "Статус=\"7\" ";
                }
                if($name == "Артикул")
                {
                    $s4.= "imageArt=\"data/elements/img/".$value.".jpg\" ";
    //              $s4.= "pdfArt=\"elements/pdf/".$value.".pdf\" ";
                }
                $s4.= $name."=\"".$value."\" ";
                }
            }
            $s0.= $s1 . $s2 . $s3 . $s4 . "/>";
            }

        foreach($group->Группа as $podgroup)
        {
            $s3 = "";
    //      echo "<br>Подгруппа:<br>";
            foreach($podgroup->attributes() as $name => $value)
            {
    //      echo $name."=".$value."<br>";
            if($name == "Название")
            $name = "НазваниеПодГруппы";
            $value = trim(htmlspecialchars(preg_replace('/ {2,}/',' ',$value)));
            if($name == "КодГруппы")
            {
                $name = "КодПодГруппы";
    //          $s3.= "imagePG=\"sections/img/".(int)$value.".jpg\" ";
            }
            $s3.= $name."=\"".$value."\" ";
            }

            foreach($podgroup->Номенклатура as $item)
            {
            $s4 = "";
    //      echo "<br>Номенклатура:<br>";
            foreach($item->attributes() as $name => $value)
                {
    //      echo $name."=".$value."<br>";
                if($name != "Характеристики" && $name != "КодКонтрагента")
                {
                $value = trim(htmlspecialchars(preg_replace('/ {2,}/',' ',$value)));
                if($name == "Наличие" && (strpos($value, '.') !== false || strpos($value, 'недел') !== false))
                {
                    $value = 0;
                }
                if ($value == 0)
                {
                    // 3-4 недели
                    $s11 = "Статус=\"9\" ";
                }
                else
                {
                    // В наличии
                    $s11 = "Статус=\"7\" ";
                }
                if($name == "Артикул")
                {
                    $s4.= "imageArt=\"data/elements/img/".$value.".jpg\" ";
    //              $s4.= "pdfArt=\"elements/pdf/".$value.".pdf\" ";
                }
                $s4.= $name."=\"".$value."\" ";


                }
            }
            $s0.= $s1 . $s11 . $s2 . $s3 . $s4 . "/>";
            }
        }
        }
    $s0 .= "</Документ></Файл>";
            $test = fwrite($fp, $s0); // Запись в файл
    //      if ($test) echo 'Данные в файл успешно занесены.';
    //      else echo 'Ошибка при записи в файл.';
    fclose($fp); //Закрытие файла
    }
    // удаляем извлеченный xml-файл за ненадобностью
    unlink($xml_path."/".$xml_name_in);
    }
    //  else echo "Архива не существует!"; //Выводим уведомление об ошибке

    ?>

входной файл:

      <Файл xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="NO_EDUPR_1_083_00_04_01_02.xsd">
        <Предприятие>ООО Триатрон</Предприятие>
        <Название>Каталог товаров</Название>
        <ДатаВыгрузки>15.10.17</ДатаВыгрузки>
        <Документ>
          <Группа Название="NXP, ST, VISHAY" КодГруппы="00006486">
            <Группа Название="NXP" КодГруппы="00006450">
              <Номенклатура Артикул="18231 " Наименование="74HC164D SO14-150 NXP микросхема" ЦенаРозничная="5.53" НормоУпаковка="2500" Производитель="NXP" Характеристики="74HC164D,653 " Наличие="7500" КодКонтрагента="0"/>
              <Номенклатура Артикул="01839 " Наименование="BAS16 (30mA/75В) SOT23 SMD (лента) диодная сборка MIC" ЦенаРозничная="0.89" НормоУпаковка="3000" Производитель="MIC" Характеристики=" " Наличие="45000" КодКонтрагента="0"/>
              <Номенклатура Артикул="01840 " Наименование="BAS21/T1 SOT23 диодная сборка NXP" ЦенаРозничная="0.63" НормоУпаковка="3000" Производитель="YANGJIE" Характеристики="BAS21 " Наличие="132000" КодКонтрагента="0"/>

выходной:

      <Файл xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="NO_EDUPR_1_083_00_04_01_02.xsd">
        <Предприятие>ООО Триатрон</Предприятие>
        <Название>Каталог товаров</Название>
        <Документ>
          <Номенклатура Статус="7" НазваниеГруппы="NXP, ST, VISHAY" КодГруппы="00006486" НазваниеПодГруппы="NXP" КодПодГруппы="00006450" imageArt="data/elements/img/18231.jpg" Артикул="18231" Наименование="74HC164D SO14-150 NXP микросхема" ЦенаРозничная="5.53" НормоУпаковка="2500" Производитель="NXP" Наличие="7500"/>
          <Номенклатура Статус="7" НазваниеГруппы="NXP, ST, VISHAY" КодГруппы="00006486" НазваниеПодГруппы="NXP" КодПодГруппы="00006450" imageArt="data/elements/img/01839.jpg" Артикул="01839" Наименование="BAS16 (30mA/75В) SOT23 SMD (лента) диодная сборка MIC" ЦенаРозничная="0.89" НормоУпаковка="3000" Производитель="MIC" Наличие="45000"/>
          <Номенклатура Статус="7" НазваниеГруппы="NXP, ST, VISHAY" КодГруппы="00006486" НазваниеПодГруппы="NXP" КодПодГруппы="00006450" imageArt="data/elements/img/01840.jpg" Артикул="01840" Наименование="BAS21/T1 SOT23 диодная сборка NXP" ЦенаРозничная="0.63" НормоУпаковка="3000" Производитель="YANGJIE" Наличие="132000"/>
READ ALSO
Ошибка подключения к Microsoft SQL Server - This extension requires the Microsoft ODBC Driver 11 for SQL Server

Ошибка подключения к Microsoft SQL Server - This extension requires the Microsoft ODBC Driver 11 for SQL Server

Использую PHP 56, все необходимые для работы драйвера скачал, пытаюсь выполнить следующий код

212
Получить массив с ID дочерних категорий

Получить массив с ID дочерних категорий

Есть список категорий и их подкатегорий:

219
CreateProcess вылетает при передаче команды длинной более 63 символов

CreateProcess вылетает при передаче команды длинной более 63 символов

Такой код работает и создаёт задачу, но стоит мне увеличить длину строки text, к примеру вместо /tn abc написать /tn abcd, программа вылетает на функции...

240