Advertisement
Trigub_Ilia

Работаем с XML в битрикс

Apr 11th, 2018
742
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.55 KB | None | 0 0
  1. Работаем с XML правильно
  2. Хочу кратко описать как работать с XML в Битриксе правильно. Ибо не так давно (ну, для меня было неожиданностью по крайней мере) API для оного обновилось, и если раньше работали в лоб с массивом из XML, то сейчас для этого есть удобные инструменты.
  3.  
  4. Итак,
  5.  
  6. Предположим, что наше XML имеет такой вид:
  7. <?xml version="1.0" encoding="UTF-8"?><videos><video><id>36408325</id><title t1="test 1" t2="test2">One Game</title></video></videos>
  8.  
  9.  
  10. 1. Сначала нам надо подключить файл класса для работы с XML:
  11. require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/classes/general/xml.php');
  12.  
  13. 2. Создаем объект класса:
  14. $xml = new CDataXML();
  15. 3. Загружаем в объект XML (который является строкой):
  16. $xml->LoadS tring($xml_string);
  17.  
  18. И раньше мы использовали такую конструкцию, получая массив и работая уже с ним:
  19. $arData = $xml->GetArray();
  20. Сейчас же все стало значительно удобнее.
  21.  
  22. Например, чтобы получить Title из XML выше, надо всего лишь сделать следующее:
  23. if ($node = $xml->SelectNodes('/videos/video/title')) {
  24.    echo $node->textContent();
  25. }
  26.  
  27. Если нода не была найдена, вернется false.
  28.  
  29. Так можно получить все атрибуты:
  30. if ($node = $xml->SelectNodes('/videos/video/title')) {
  31.    print_r($node->getAttributes());
  32. }
  33.  
  34. Где каждый из ни будет объектом CDataXMLNode
  35. 1.jpg
  36. А вот так конкретный атрибут ноды:
  37. if ($node = $xml->SelectNodes('/videos/video/title')) {
  38.    echo $node->getAttribute('t1');
  39. }
  40.  
  41.  
  42. Что еще. Допустим, у нас есть массив нодов, как обработать их. Дополним наш xml блоком:
  43. <pics>
  44.    <pic>1</pic>
  45.    <pic>2</pic>
  46.    <pic>3</pic>
  47. </pics>
  48.  
  49. Тогда, чтобы перебрать все pic, надо сделать так:
  50. if ($node = $xml->SelectNodes('/videos/video/pics')) {
  51.    print_r($node->children());
  52. }
  53.  
  54. Где каждый такой чилдрен будет объектом CDataXMLNode.
  55.  
  56. Этого вполе достаточно для работы. Но более подробно изучить класс вы сможете по пути из п.1.
  57.  
  58. Дополнение:
  59.  
  60. 1. Если формат XML с двоеточиями (неймспейсы которые, хз как правильно его называть):
  61. <media:title></media:title>
  62.  
  63. то перед парсингом, надо сделать следующее:
  64. $xml->delete_ns=false;
  65.  
  66. Спасибо за совет техподдержке.
  67.  
  68.  
  69. 2. Можно использовать не LoadString, а Load, которой передать абсолютный путь до файла. Метод хорош тем, что автоматически вычленяет кодировку из XML-файла (encoding) и конвертит файл в кодировку сайта. Есть минус - если кодировки в файле не найдется, будет считать, что файл находится в windows-1251 кодировке.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement