+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Работаем с XML правильно

Хочу кратко описать как работать с XML в Битриксе правильно. Ибо не так давно (ну, для меня было неожиданностью по крайней мере) API для оного обновилось, и если раньше работали в лоб с массивом из XML, то сейчас для этого есть удобные инструменты.

Итак,

Предположим, что наше XML имеет такой вид:
<?xml version="1.0" encoding="UTF-8"?><videos><video><id>36408325</id><title t1="test 1" t2="test2">One Game</title></video></videos>


1. Сначала нам надо подключить файл класса для работы с XML:
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/classes/general/xml.php');

2. Создаем объект класса:
$xml = new CDataXML();
3. Загружаем в объект XML (который является строкой):
$xml->LoadS tring($xml_string);

И раньше мы использовали такую конструкцию, получая массив и работая уже с ним:
$arData = $xml->GetArray();
Сейчас же все стало значительно удобнее.

Например, чтобы получить Title из XML выше, надо всего лишь сделать следующее:
if ($node = $xml->SelectNodes('/videos/video/title')) {
   echo $node->textContent();
}

Если нода не была найдена, вернется false.

Так можно получить все атрибуты:
if ($node = $xml->SelectNodes('/videos/video/title')) {
   print_r($node->getAttributes());
}

Где каждый из ни будет объектом CDataXMLNode
1.jpg
А вот так конкретный атрибут ноды:
if ($node = $xml->SelectNodes('/videos/video/title')) {
   echo $node->getAttribute('t1');
}


Что еще. Допустим, у нас есть массив нодов, как обработать их. Дополним наш xml блоком:
<pics>
   <pic>1</pic>
   <pic>2</pic>
   <pic>3</pic>
</pics>

Тогда, чтобы перебрать все pic, надо сделать так:
if ($node = $xml->SelectNodes('/videos/video/pics')) {
   print_r($node->children());
}

Где каждый такой чилдрен будет объектом CDataXMLNode.

Этого вполе достаточно для работы. Но более подробно изучить класс вы сможете по пути из п.1.

Дополнение:

1. Если формат XML с двоеточиями (неймспейсы которые, хз как правильно его называть):
<media:title></media:title>

то перед парсингом, надо сделать следующее:
$xml->delete_ns=false;

Спасибо за совет техподдержке.


2. Можно использовать не LoadString, а Load, которой передать абсолютный путь до файла. Метод хорош тем, что автоматически вычленяет кодировку из XML-файла (encoding) и конвертит файл в кодировку сайта. Есть минус - если кодировки в файле не найдется, будет считать, что файл находится в windows-1251 кодировке.

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...