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
Postar um comentário