Задать вопрос
@redesupar

Как сохранить сформированный через php xml в файл на сервере?

есть код, пытался через file сохранить и пытался и через curl, но ничего не получается, как сделать? подскажите пожалуйста
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
/*
 * Настройки
 */
require($_SERVER["DOCUMENT_ROOT"]."/1c_exchange/core/options.php");
/*
 * Функции
 */
require($_SERVER["DOCUMENT_ROOT"]."/1c_exchange/core/functions.php");

$reader = new XMLReader();
$xmlfile = GetXML("users");
if (!$reader->xml($xmlfile)){
    $error_text = date("d.m.Y H:i:s")." - Импорт сотрудников: полученный ответ от веб-сервиса не удалось открыть на чтение, как xml файл";
    hlb_import_log($error_text);
    die($error_text);
}
$arPositions = array();
//справочник должнсотей. их меньеш чем юзеров так что сначала получим его
CModule::IncludeModule("highloadblock");
$hlblock = Bitrix\Highloadblock\HighloadBlockTable::getById(HLB_POSITIONS_ID)->fetch();
$entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$resPosition = $entity_data_class::getList(array ('order' => array ("ID" => "ASC"), 'filter' => array(), 'select' => array('*')));
while($arPosition = $resPosition->Fetch())  $arPositions[$arPosition["UF_NAME"]] =  $arPosition;
$oUser = new CUser;
while ($reader->read()):
     if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:items'){
         $data = new XMLReader();
         $data->xml($reader->readOuterXML());
         $UserFields = [];
         $AcceptedPosition = [];
         while($data->read()){
             switch ($data->name){
                 case "m:id": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["XML_ID"] = $v;  break; //внешний код
                 case "m:loginAD": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["LOGIN"] =  $data->readInnerXML(); break; //логин
                 case "m:surname_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["LAST_NAME"] =  $data->readInnerXML(); break; //фамилия
                 case "m:name_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["NAME"] =  $data->readInnerXML(); break; //имя
                 case "m:middlename_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["SECOND_NAME"] =  $data->readInnerXML(); break; //отчество
                 case "m:birthDay": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["PERSONAL_BIRTHDAY"] =  ConvertTimeStamp(strtotime($data->readInnerXML()), "SHORT", "ru"); break; //дата рождения
                 case "m:assistant":
                     $v = $data->readInnerXML(); if(strlen($v)>0){
                        $UserFields["UF_ASSISTANT"] =  CUser::GetByLogin($v)->Fetch()["ID"];
                    }
                     break; //асистент
                 case "m:position":
                     $v = $data->readInnerXML(); if(strlen($v)>0 && isset($arPositions[trim($v)]["ID"])){
                        $UserFields["UF_CUSTOM_POSITION"] =  $arPositions[trim($v)]["ID"];
                        $AcceptedPosition[$arPositions[trim($v)]["ID"]] = trim($v);
                     }
                     break; //должность
                 case "m:subdivisioncode":
                     $v = $data->readInnerXML(); if(strlen($v)>0){
                         $res = CIBlockSection::GetList(Array(), array("CODE"=>$v.""), false, array("ID"));
                         if($ar = $res->Fetch()) {
                             $UserFields["UF_DEPARTMENT"] = array($ar["ID"]);
                         }
                      }
                      break;//подразделение
             }

         }

     }
 endwhile;

$path = $_SERVER["DOCUMENT_ROOT"].log_users.'hlb_import_users.xml';
file_put_contents($path, file_get_contents($data));
die("success");
  • Вопрос задан
  • 264 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@iljaGolubev
но ничего не получается
- плохой диагноз.

В $data у вас XMLReader которые не умеет автоматом __toString. А вы его в `file_get_contents(filename: $data)` суёте. Что по вашему должно произойти?

Само название XMLReader говорит от назначении "читать".
Для записи используйте XMLWriter.
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Смотрите в errorlog вашего HTTP-сервера. Туда попадают все сообщения об ошибках в PHP, в том числе о невозможности записать что-то в файл. Заодно проверьте содержимое $path, там действительно путь в существующую директорию? А в $data деяствительно есть текст для записи?
Ответ написан
@alexalexes
// тут нужно создать болванку для исходящего xml документа с помощью XMLWriter.
// перед входом в цикл нужно создать болванку списка юзеров
while ($reader->read()):
     if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:items'){
        //........
         $UserFields = [];
         $AcceptedPosition = [];
         while($data->read()){
             switch ($data->name){
               // ....................
             }
            
         }
         // считали свойства юзера во входящем документе, тут нужно создать элемент юзера в исходящем и закинуть туда значения из $UserFields,  $AcceptedPosition 
     }
// закончили читать список юзеров, нужно закрыть список юзеров в исходящем доке.
// закрыть исходящий док
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы