Back-End

15 jun, 2018

Convertendo arrays em XML com PHP

Publicidade

Fala pessoal, tudo bom? No artigo de hoje vou falar sobre algo que me aflingiu a alguns anos atrás. Eu trabalhei muitos anos com produtos fiscais e mantinha um sistema de notas fiscais eletrônicas. E algo que muitas vezes me dava dor de cabeça era transformar os dados que os clientes enviavam pelo sistema em XML (que é no caso a linguagem padrão para o sistema de nota fiscal eletrônica.

Se eu conhecesse essa solução na época seria muito bom, pois, é uma biblioteca bem simples que resolve muito bem o problema de geração de XML através de arrays, com a possibilidade de geração bem rápida de atributos, CDATA e outros cabeçalhos para os seus XMLs.

Antes de começar gostaria de agradecer ao Jairo Mendes que foi quem me falou de algumas bibliotecas que estavam no github da Spatie, sim, essa é a empresa do Freek van Der Herten que palestrou no PHP Experience 2018. Inclusive a palestra dele sobre como construir um dashboard com PHP e Websockets está no ar no youtube do iMasters.

Agora, vamos codar.

Primeiramente vamos criar uma pasta xml e vamos realizar a importação da biblioteca array-to-xml para o nosso projeto.

composer require spatie/array-to-xml


E, vamos criar um xml bem simples. Nomeando como xml1.php

<?php

require_once 'vendor/autoload.php'; //importando o autoload

use Spatie\ArrayToXml\ArrayToXml; //importando a classe ArrayToXml

$array =  [
    'Pokemaobr' => [
        'name' => 'Rodrigo Cardoso',
        'company' => 'iMasters'
    ],
	'Bob' => [
        'name' => 'Gabriel Rodrigues Couto',
        'company' => 'Memed'
    ],
        'Jucy' => [
        'name' => 'Juciellen Cabrera',
        'company' => '4Linux'
    ],
	'Duodraco' => [
        'name' => 'Anderson Casimiro',
        'company' => 'TOTVS'
    ],
    'Tekzoom' => [
        'name' => 'Reinaldo Silotto',
        'company' => 'iMasters'
    ]

]; //definindo o array que será convertido em XML

$result = ArrayToXml::convert($array); //convertendo o array em XML

print ($result); //exibindo o resultado

file_put_contents('xml1.xml', $result); //salvando o conteúdo do XML como xml1.xml

E, executando o script:

php index1.php

Será gerado então o seguinte XML:

Podemos também incluir atributos e/ou CDATA (xml2.php).

<?php

require_once 'vendor/autoload.php'; //importando o autoload

use Spatie\ArrayToXml\ArrayToXml; //importando a classe ArrayToXml

$array =  [
    'Pokemaobr' => [
        'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Rodrigo</h1>'
	    ],
        'company' => 'iMasters'
    ],
	'Bob' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Gabriel</h1>'
	    ],
        'company' => 'Memed'
    ],
	'Jucy' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Juciellen</h1>'
	    ],
        'company' => '4Linux'
    ],
	'Duodraco' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Anderson</h1>'
	    ],
        'company' => 'TOTVS'
    ],
    'Tekzoom' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Reinaldo</h1>'
	    ],
        'company' => 'iMasters'
    ]
]; //definindo o array que será convertido em XML

$result = ArrayToXml::convert($array); //convertendo o array em XML

print ($result); //exibindo o resultado

file_put_contents('xml2.xml', $result);

O resultado de php xml2.php é:

Também é possível modificar o elemento raiz e incluir atributos nele.

<?php

require_once 'vendor/autoload.php'; //importando o autoload

use Spatie\ArrayToXml\ArrayToXml; //importando a classe ArrayToXml

$array =  [
    'Pokemaobr' => [
        'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Rodrigo</h1>'
	    ],
        'company' => 'iMasters'
    ],
	'Bob' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Gabriel</h1>'
	    ],
        'company' => 'Memed'
    ],
	'Jucy' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Juciellen</h1>'
	    ],
        'company' => '4Linux'
    ],
	'Duodraco' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Anderson</h1>'
	    ],
        'company' => 'TOTVS'
    ],
    'Tekzoom' => [
         'name' => [
		    '_attributes' => [
			    'type' => 'first'
		    ],
			'_cdata' => '<h1>Reinaldo</h1>'
	    ],
        'company' => 'iMasters'
    ]
]; //definindo o array que será convertido em XML

$result = ArrayToXml::convert($array, [
    'rootElementName' => 'devs',
    '_attributes' => [
        'xmlns' => 'https://imasters.com.br',
    ],
]); //convertendo o array em XML

print ($result); //exibindo o resultado

file_put_contents('xml3.xml', $result);

Que tem como resultado da execução:

Bem, com esses exemplos você poderá criar a partir de um array todo tipo de XML.

Espero que tenham gostado, até a próxima