Хочу кратко описать как работать с 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. Создаем объект класса:
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
А вот так конкретный атрибут ноды:
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> |
то перед парсингом, надо сделать следующее:
Спасибо за совет техподдержке.
2. Можно использовать не LoadString, а Load, которой передать абсолютный путь до файла. Метод хорош тем, что автоматически вычленяет кодировку из XML-файла (encoding) и конвертит файл в кодировку сайта. Есть минус - если кодировки в файле не найдется, будет считать, что файл находится в windows-1251 кодировке.