PHP - xml_encode(), função que converte uma array para XML semelhante ao json_encode()


A algum tempo estava precisando gerar dados no formato XML a partir de um banco de dados. Havia um sistema legado que gerava arquivos .html e tentei entender a lógica como um todo e... acabei desistindo. As páginas eram geradas através de preenchimento de Templates e, para XML, esta solução seria muito, muito complicada e chata.

Comecei a criar uma classe específica para a geração dos XMLs diretamente do banco de dados e baseada em array, criando a estrutura do XML dentro desta array, assim como fazemos com a função json_encode(). Foi quando percebi que também seria difícil fazê-lo pois não existe uma função nativa no PHP semelhante a json_encode(). O que existe é a biblioteca SimpleXML mas mesmo esta não possuía nada que fosse prático para meu problema.

Foi ai que pesquisei pela Web e encontrei no link abaixo uma solução muito interessante.

http://darklaunch.com/2009/05/23/php-xml-encode-using-domdocument-convert-array-to-xml-json-encode

Infelizmente esta solução não contemplava alguns detalhes de nosso língua portuguesa. Então tive de 'botar a mão na massa' e fazer alguns ajustes.

O Script abaixo é o resultado de minha modificação e ele tem sido bem útil.

<?php

function xml_encode($mixed, $header = true, $domElement = null, $DOMDocument = null)
{
if  (is_null($DOMDocument))  { //Cria o objeto

$DOMDocument = new DOMDocument("1.0", "UTF-8");
$DOMDocument->formatOutput = true;
xml_encode($mixed,$header,$DOMDocument,$DOMDocument);

// Retira a declaração do header do XML $header = 'false'
return ($header)? $DOMDocument->saveXML() : $DOMDocument->saveXML($DOMDocument->documentElement); 

}  else  { // Popula

if  (is_array($mixed))  {

foreach  ($mixed as $index => $mixedElement)  {
if  (is_int($index))  {

if  ($index == 0)  {
$node = $domElement;
}  else  {
$node = $DOMDocument->createElement($domElement->tagName);
$domElement->parentNode->appendChild($node);
}

}  else  {

$plural = $DOMDocument->createElement($index);
$domElement->appendChild($plural);
$node = $plural;

if  (rtrim($index,'') !== $index)  {
$singular = $DOMDocument->createElement(rtrim($index,''));
$plural->appendChild($singular);
$node = $singular;
}

}

xml_encode($mixedElement,$header,$node,$DOMDocument);
}

}  else  {

$domElement->appendChild($DOMDocument->createTextNode($mixed)); // Indere o valor dentro da tag

}

}
}

Para utilizar a função segue exemplo abaixo:

<?php

$data = Array(
'conteudo' => Array(
'item' => Array(
Array(
'nome' => 'a'
),
Array(
'nome' => 'b'
)
)
)
);

echo xml_encode($data);

Teremos como resposta:

<?xml version="1.0" encoding="UTF-8"?>
<conteudo>
  <item>
    <nome>a</nome>
  </item>
  <item>
    <nome>b</nome>
  </item>
</conteudo>

Se quisermos retirar o cabeçalho setamos false o parâmetro $header

<?php

$data = Array(
'conteudo' => Array(
'item' => Array(
Array(
'nome' => 'a'
),
Array(
'nome' => 'b'
)
)
)
);

echo xml_encode($data,false);

Teremos como resultado:


<conteudo>
  <item>
    <nome>a</nome>
  </item>
  <item>
    <nome>b</nome>
  </item>
</conteudo>

Espero que seja útil para vocês.
Abraço

Comentários

Postagens mais visitadas deste blog

PHP - Utilizando proxy e CURL para acessar servidores ou sites

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()