Feed e Twitter

Feed RSS Twitter

Busca

Por Lustosa em 02/01/2009 às 00:20

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 pequeno problema

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.

O script

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:

  • complexType, que deve ser setado ou para ‘array’ ou para ‘object’, dependendo de como se deseja receber os dados do XML. Por padrão, a conversão é feita para arrays.
  • tagMap, que recebe um array associativo, com as chaves correspondendo às entidades do XML, e os valores correspondendo à classe no PHP.

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.

Conclusão

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.

Artigos relacionados

Arquivado em programação
Tags: , ,

Feed RSS para os comentários deste artigo.


Fechado!


Copyright 2009 Ataraxia!   Sinopse