Битрикс и XML

Столкнулся я на днях с одной проблемой — нужно было сделать импорт пары xml-файлов в инфоблоки битрикса по крону. Собственно, это совершенно не проблема, но хотелось реализовать её полностью на API битрикса. И тут началось самое интересное.

Bitrix вообще-то умеет работать с xml. А версии 6.5 там вообще много чего хорошего появилось, типа пошагового импорта из xml/CommerceML. Но вот незадача — в документации нет ни слова про то, как работать с xml’ем через API.

Дело было ясное, что дело темное. Класс такой есть, но просто он не описан в документации. Так и оказалось. Подтверждение этому я нашел на партнерском форуме. Но всё, что там было сказано, так это о существовании класса CDataXML и о том, что он не описан в документации. Больше никаких упоминаний о битриксе и ручном иморте из xml мной найдено не было, что еще раз подтверждает мою теорию о том, что битриксом никто не пользуется хоть как-то глубже создания инфоблоков и их наполнения.

С горем пополам я нашел этот класс и то, как им пользоваться. Подключать класс, оказывается, нужно ручками. Ядро его не поддерживает по-умолчанию.

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/xml.php");

Дальше всё просто — создаем новый объект и скармливаем в него либо файл либо строку с xml. Причем файлы он кушает только локально и проверяет их на существование. Поэтому если надо что-то взять извне, то это что-то надо либо в строку запихнуть ручками, либо слить на текущий сервер.


$objXML = new CDataXML();
$objXML->Load($_SERVER['DOCUMENT_ROOT'].$file);
$arResult = $objXML->GetArray();

$arResult и будет наш массив. С ним уже работать просто.
Если нужно получить данные из строки, то делаем так:

objXML->LoadString($xmlstring);

На самом деле, тут нет ничего сложного, просто нигде в документации/форуме не описано как с этим работать. Вот я и подумал, что может это кому-то пригодиться.

В итоге весь код импорта xml уложился в 20 строк с проверкой обновлений элементов. А вывод того, что получилось — и вообще 0 строк кода :). Все про все заняло минут 20. За это я и люблю bitrix. Еще больше буду любить, когда в документацию все-таки внесут все, что есть в API.
***

И немного про Altastat. Пока мне там всё нравится! Контекст на каталоге сайтов и еще на одном… не знаю как его назвать… в общем сайте работает неплохо. Есть клики по 30 центов. Правда проверка бидов в интерфейсе альтастата что-то не работает, поэтому не могу посчитать что к чему. Так же мои сайты были одобрены для программы альтамедиа. Рич пока не пробовал, т.к. он итак сейчас откручивается неплохо. А вот топлайн включил, т.к. в adgravity топлайна всё еще нет. За сегодня уже 12 тысяч оплаченых показов. По 50 центов за 1000. Думаю, за сутки будет тысяч 30 или даже больше. 15 баксов в день-то не лишние :). И еще один большой плюс этой программы — у неё пока мало участников. Большой простор для привлечения рефералов.

В закладки!

Битрикс и XML: 15 комментариев

  1. Не могли бы Вы поподробнее рассказать об этом: где и какие модули подключить и как осуществить импорт XML файлов через API, не открывая БИТРИКС. Заранее Вым благодарен.

  2. Не открывая битрикс — это как?
    Вообще в документации по битриксу все расписано. Модуль нужен только CMain. Дополнительно ничего подключать не нужно.

  3. >> «В итоге весь код импорта xml уложился в 20 строк с проверкой обновлений элементов»

    А можно узнать эти 20 строк? Я так понял, что этот код:
    $objXML = new CDataXML();
    $objXML->Load($_SERVER[‘DOCUMENT_ROOT’].$file);
    $arResult = $objXML->GetArray();

    Создает из xml’a массив, а вот как дальше распихать этот массив по инфоблокам непонятно.

    Заранее спасибо)

  4. @Al так это ж элементарно.
    Пройтись по нему циклом, и через API запихать ($b=new CIBlockElement; $b->Add($array));
    все есть в документации

  5. Спасибо за оперативность)

    А можно рабочий пример? Так будет гораздо нагляднее.

    В экспортированном xml’e все как то хитро переплетено, по уму бы сделать иерархию понятную вроде:

    Тут все понятно было бы, создать новый тип инфоблока, передать в него массив «тип инфоблока», потом создать инфоблок и передать в него массив «инфоблок». И на третьем этапе для каждого элемента массива «элементы» создать соответственно элемент.

    На деле у меня примерно такая структура просматривается, хотя может я как то криво смотрю:

    Тут свойства самого типа инфоблока

    И фиг пойми как оттуда данные вытаскивать.

  6. Блин. Все тэги обрезало(((

    Ладно попробуем подругому. В прошлом посте первый вариант, тот который хотелось бы видеть:

    <хмл
    <тип инфоблока
    </тип инфоблока

    <инфоблок
    </инфоблок

    <элементы
    </элементы
    </хмл

    Второй вариант который у меня на самом деле из экспортированного файла:

    <хмл
    <инфоблок
    </инфоблок

    <тип инфоблока
    Тут свойства самого типа инфоблока
    <элементы
    </элементы
    </тип инфоблока
    </хмл

    И фиг пойми как оттуда данные вытаскивать.

  7. Ну конкретный пример сложно привести. У меня было достаточно просто. Я руками создал инфоблок и все свойства его, а потом тупо туда засовывал данные из xml-массива. Скажу чествно, уже не помню, для какого проекта я это делал, ибо запись двухлетней давности :). Найти будет непросто.

  8. ну смотри, после $arResult = $objXML->GetArray(); у тебя получается массив $arResult;
    сделай ему print_r($arResult) и вся структура массива сразу станет видна. А дальше тупо циклами там ходишь и всё.

  9. >> «ну смотри, после $arResult = $objXML->GetArray(); у тебя получается массив $arResult;
    сделай ему print_r($arResult) и вся структура массива сразу станет видна.»

    Да я собственно так и сделал)
    После такого импорта arResult получается точно такой как xml, то есть все вложенные тэги это подмассивы.

    Ту загадочную структуру xml которую создает битрикс я уже привел выше во втором варианте :) Просто циклами там не получиться там придется как то похитрому делать) Я так думаю руками придется указывать все кроме самих элементов, а их как раз циклом сделать.

    Ладно, спасибо за пояснения буду пробовать)

  10. А толку от таких сложных действий никакого.

    ImportXMLFile(«/load_xml/».$file_xml[$i], $iblock_type=»schedule», $site_id=false, $section_action=»D», $element_action=»D», $use_crc=false, $preview=false);

    И все.

  11. Писал не раз парсеры xml для импорта в битрикс. Битриксовский класс, конечно, хорош, но на больших объёмах данных отваливается. Пихать в массив весь импортируемый файл это всё-таки не тру)

  12. Прошу помощи: есть ли в битриксе возможность через API записать в инфоблок информацию не представлению в XML. У меня есть строки: заголовок статьи и ее краткое содержание. Мне их необходимо записать в уже существующий инфоблок.
    Буду благодарна за любую информацию.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>