Feed e Twitter

Feed RSS Twitter

Busca

Por Lustosa em 01/01/2009 às 17:31

XML é a linguagem da moda! Parece que todo programa, para conseguir ter algum respeito hoje em dia, precisa usar XML pra alguma coisa. Como o XML é uma linguagem em texto, existem diversas formas de se ler um documento XML.

Uma das formas é tratar o documento como uma grande string, e ir “fatiando” as tags para se conseguir buscar os valores desejados. De todos, acredito que este seja o método menos flexível, pois ignora toda a estrutura do documento. Além disso, fica bastante complexo extrair informações de objetos compostos codificados em XML (um Array de objetos, por exemplo). Porém, é uma forma simples, e que não requer muito conhecimento (apenas as funções de tratamento de string, ou expressões regulares).

O PHP disponibiliza outras formas de se trabalhar com XML, como as funções para leitura de XML usando a API de DOM, e também a bastante conhecida SimpleXML.

Como mais uma alternativa, apresentarei as classe XML_Serializer e XML_Unserializer do PEAR.

PEAR XML_Serializer

Esta classe do PEAR transforma tipos de dados complexos, como arrays e objetos, em um documento XML. Seu uso é bastante simples, e para ilustrar com um objeto um pouco complexo, vou usar o método raiseError da classe PEAR para gerar um objeto de erro.

<?php
require 'XML/Serializer.php';
 
$erro = PEAR::raiseError('rah!', 999);
print_r($erro); // Imprime a estrutura do objeto na tela
 
// Serializa o erro em um documento XML
$opt = Array('indent'  => '  ',
             'addDecl' => true,
             'typeHints' => true);
$serializer = new XML_Serializer($opt);
$serializer->serialize($erro);
print $serializer->getSerializedData();
?>

Executando-se este script, primeiro temos impressa a estrutura do erro gerado, com a função print_r():

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] => 
)

E em seguida, fazemos a conversão deste objeto usando o XML Serializer. Existem várias opções que podem ser passadas para o construtor, mas no exemplo só passei o parâmetro que especifica o que deve ser usado para indentar o código (no caso, escolhi 2 espaços em branco), e o parâmetro addDecl, que coloca o prólogo XML no início do documento. O prólogo XML é a declaração que inicia todo documento XML (<?xml version=”1.0″ ?>).

Além disso, como pretendo usar a saída em XML deste exemplo na segunda parte deste artigo, também passei a opção typeHints, que coloca atributos nas tags com “dicas” sobre o tipo original do dado. Isto é necessário para que a decodificação seja feita com sucesso, pois sem ela, as informações de qual tipo o dado é (objeto, de qual classe, ou array, etc) são perdidas.

A saída do método getSerializedData() já é o documento XML formatado:

<?xml version="1.0"?>
<PEAR_Error _class="PEAR_Error" _type="object">
  <error_message_prefix _type="string" />
  <mode _type="integer">1</mode>
  <level _type="integer">1024</level>
  <code _type="integer">999</code>
  <message _type="string">rah!</message>
  <userinfo _type="NULL" />
  <backtrace _type="array">
    <XML_Serializer_Tag _originalKey="0" _type="array">
      <file _type="string">/usr/share/php/PEAR.php</file>
      <line _type="integer">576</line>
      <function _type="string">PEAR_Error</function>
      <class _type="string">PEAR_Error</class>
      <type _type="string">-&gt;</type>
      <args _type="array">
        <XML_Serializer_Tag _originalKey="0" _type="string">rah!</XML_Serializer_Tag>
        <XML_Serializer_Tag _originalKey="1" _type="integer">999</XML_Serializer_Tag>
        <XML_Serializer_Tag _originalKey="2" _type="integer">1</XML_Serializer_Tag>
        <XML_Serializer_Tag _originalKey="3" _type="integer">1024</XML_Serializer_Tag>
        <XML_Serializer_Tag _originalKey="4" _type="NULL" />
      </args>
    </XML_Serializer_Tag>
    <XML_Serializer_Tag _originalKey="1" _type="array">
      <file _type="string">/home/lustosa/xml.php</file>
      <line _type="integer">4</line>
      <function _type="string">raiseError</function>
      <class _type="string">PEAR</class>
      <type _type="string">::</type>
      <args _type="array">
        <XML_Serializer_Tag _originalKey="0" _type="string">rah!</XML_Serializer_Tag>
        <XML_Serializer_Tag _originalKey="1" _type="integer">999</XML_Serializer_Tag>
      </args>
    </XML_Serializer_Tag>
  </backtrace>
  <callback _type="NULL" />
</PEAR_Error>

Pronto! Transformamos o objeto em um XML válido. Você talvez tenha notado várias tags XML_Serializer_Tag espalhadas pelo XML. Isto acontece quando temos um array de índices numéricos. Os atributos ‘_type’ e ‘_originalKey’ são as dicas mencionadas anteriormente, e ajudarão o XML Unserializer a retornar o XML para o objeto original.

Na parte 2 deste artigo, veremos a classe XML_Unserializer, que faz justamente o trabalho inverso, transformando um documento XML em uma variável no PHP.

Artigos relacionados

Arquivado em programação
Tags: , ,

Feed RSS para os comentários deste artigo.


Fechado!


Copyright 2009 Ataraxia!   Sinopse