Na primeira parte do artigo, vimos como usar a classe PEAR XML_Serializer para transformar dados do PHP em documentos XML.
Nesta segunda parte, veremos como fazer o inverso, ou seja, transformar um documento XML em uma variável no PHP.
Um problema que podemos ter é em relação ao mapeamento de dados do XML para classes no PHP. Como o XML normalmente não possui a informação de qual classe do PHP corresponde a quais entidades do XML, isto precisará ser informado por nós, caso queiramos fazer este mapeamento. Caso contrário, teremos arrays ou instâncias de StdClass, a classe genérica do PHP, para descrever os objetos. Veremos como resolver isto mais adiante.
Isto não se aplica ao nosso exemplo, pois utilizamos type hints na geração do XML, para não termos a informação perdida.
Assumindo que gravamos o XML gerado pelo exemplo anterior em um arquivo chamado doc.xml, o seguinte script irá ler e traduzir o XML:
<?php require 'XML/Unserializer.php'; $unserializer = new XML_Unserializer(); $unserializer->unserialize("erro.xml", true); $erro = $unserializer->getUnserializedData(); print_r($erro); ?>
O segundo parâmetro passado para o método unserialize() especifica que o primeiro parâmetro é o nome de um arquivo, e não uma string com o XML. A saída deste script é a variável com o erro original.
PEAR_Error Object ( [error_message_prefix] => [mode] => 1 [level] => 1024 [code] => 999 [message] => rah! [userinfo] => [backtrace] => Array ( [0] => Array ( [file] => /usr/share/php/PEAR.php [line] => 576 [function] => PEAR_Error [class] => PEAR_Error [type] => -> [args] => Array ( [0] => rah! [1] => 999 [2] => 1 [3] => 1024 [4] => ) ) [1] => Array ( [file] => /home/lustosa/xml.php [line] => 4 [function] => raiseError [class] => PEAR [type] => :: [args] => Array ( [0] => rah! [1] => 999 ) ) ) [callback] => )
O objeto só foi retornado exatamente ao estado original por causa das type hints que colocamos ao gerar o XML. Caso não tivéssemos colocado, teríamos problemas nesse ponto, pois as informações do tipo de dado original teriam sido perdidas, e precisaríamos dar algum tratamento extra para termos exatamente o objeto original.
Normalmente, ao desenvolver, nós temos que fazer ou uma parte ou outra. Ou precisamos disponibilizar dados em XML para alguém, ou precisamos processar dados em XML gerados por alguém.
Caso a necessidade seja a geração, muito provavelmente os programadores que irão tratar o XML não precisarão dessas informações extras de tipo, pois são pertinentes apenas ao sistema de origem, onde o XML foi gerado.
E da mesma forma, caso precisemos apenas processar um XML gerado, a informação do tipo original nem sempre é útil para nós. Porém, dependendo da estrutura do XML, pode ser útil fazer o mapeamento de algumas estruturas do XML para classes no PHP preparadas para receber a informação do XML.
Existem diversas opções que podem ser passadas para o Unserializer, de forma a fazer este mapeamento. Temos, por exemplo:
Assim, se no XML temos uma tag <util> e queremos mapeá-la a um objeto do tipo XML_Util, poderíamos passar para o Unserializer um array como o seguinte:
$opt = Array('complexType' => 'object', 'tagMap' => Array('util' => 'XML_Util');
Pronto, teremos objetos no lugar de arrays, que por padrão serão objetos genéricos, do tipo StdClass, mas que no caso das tags ‘util’, serão mapeados para objetos do tipo XML_Util.
Existem muitas outras opções que podem ser usadas, dependendo to nível de customização necessário.
O PHP disponibiliza várias opções para mexermos com XML, e embora o SimpleXML e o DOM sejam opções bem populares, a classe XML_Serializer do PEAR pode ser uma opção bastante versátil, dependendo do que se deseja fazer.
Feed RSS para os comentários deste artigo.
Nenhum comentário.