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.
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">-></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.
Feed RSS para os comentários deste artigo.
Nenhum comentário.