БлогNot. PHP: преобразовать массив в файл XML

PHP: преобразовать массив в файл XML

Часто бывает нужно сохранить данные формата XML в базе данных или в файле для дальнейшего использования.

Так как на PHP в большинстве случаев достаточно применения массивов для хранения структур данных любой сложности, нам поможет расширение SimpleXML и небольшая рекурсивная функция-"обёртка" над ним.

Код проверялся в актуальной сборке XAMPP с PHP 7.4.X.

<?php 
 function arrayToXml ($array, $rootElement = null, $xml = null) { 
  $_xml = $xml; 
  if ($_xml === null) { 
   $_xml = new SimpleXMLElement ($rootElement !== null ? $rootElement : '<root/>'); 
  } 
  foreach ($array as $k => $v) { 
   if (is_array($v)) {  
    arrayToXml ($v, $k, $_xml->addChild($k)); 
   } 
   else { 
    $_xml->addChild($k, $v); 
   } 
  } 
  return $_xml->asXML(); 
 } 
  

$arr = [
 'name' => 'Попандопулос В.А.', 
 'subject' => 'RU', 
 'contacts' => [
  'city' => 'Нерезиновка', 
  'email' => [ 'mail_1' => 'admin@gmail.com', 'mail_2' => 'gates@microsoft.com' ],
  'state' => 'ЦФО'
 ] 
]; 

$xml = arrayToXml($arr);
echo '<textarea>',$xml,'</textarea>'; //Одной строкой, без форматирования

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->loadXML($xml);
echo '<br><textarea>',$doc->saveXML(),'</textarea>'; //С форматированием
?> 

Функция arrayToXml выдаст "неформатированный" XML одной строкой. Форматировать данные позволяет другое расширение, DOMDocument, как это сделать, также показано в коде.

Не все наименования элементов разрешены, например, <1> вместо <mail_1> вызовет ошибку.

Итоговая получившаяся разметка XML такова:

<?xml version="1.0"?>
<root>
  <name>Попандопулос В.А.</name>
  <subject>RU</subject>
  <contacts>
    <city>Нерезиновка</city>
    <email>
      <mail_1>admin@gmail.com</mail_1>
      <mail_2>gates@microsoft.com</mail_2>
    </email>
    <state>ЦФО</state>
  </contacts>
</root>

22.08.2020, 00:27 [1367 просмотров]


теги: программирование php форматы xml

К этой статье пока нет комментариев, Ваш будет первым