PHP com XML - 3ª Edição

Page 1

Guia de Consulta Rápida

PHP com XML Juliano Niederauer

Terceira Edição

Novatec


Copyright  2002 da Novatec Editora Ltda. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates

ISBN: 978-85-7522-119-8 Primeira impressão: Outubro/2002 Segunda edição: Outubro/2004 Terceira edição: Julho/2007

Novatec Editora Ltda.

Rua Luís Antônio dos Santos 110 02460-000 São Paulo SP – Brasil Tel.: +55 11 6959-6529 Fax: +55 11 6950-8869 E-mail: novatec@novatec.com.br Site: www.novatec.com.br


Sumário

Conceitos básicos....................................................................5 O que é PHP?....................................................................5 O que é XML?...................................................................6 Usando PHP com XML......................................................6 Instalando a extensão expat.....................................................8 Analisando um documento XML com PHP..............................9 Criando um parser XML....................................................9 Definindo as funções de manipulação................................9 Mapeamento de tags XML............................................... 12 Executando o parser e manipulando erros........................ 15 Usando um array para analisar os dados.................... 17 Buscando dados em um documento XML..................20 Liberando a memória utilizada........................................ 24 Exemplos completos........................................................ 25 Funções DOM XML...............................................................31 O que é um parser DOM?.................................................31 Diferenças entre parsers SAX e DOM............................... 32 Carregando e manipulando os dados em memória........... 32 Exemplo de parser DOM................................................. 34 Transformando documentos XML com PHP e XSLT............... 37 O que é XSLT?................................................................ 37 Como é feita a transformação........................................... 37 Exemplo de folha de estilo XSLT...................................... 39 Criando um processador XSLT no PHP............................40 Executando uma transformação.......................................40 Liberando a memória utilizada........................................ 41 Exemplo completo de transformação XSLT....................... 41 Usando PHP para gerar arquivos XML................................... 45 Por que criar arquivos XML?............................................ 45 Gerando a partir do MySQL............................................ 45 Gerando a partir do PostgreSQL...................................... 47 Funções PHP para um parser XML........................................ 49 Lista das funções PHP / DOM XML...................................... 62 Outra alternativa: SimpleXML............................................... 65 Obtendo o conteúdo XML............................................... 65 Acessando os campos dos registros...................................66 Percorrendo os registros com foreach................................ 67 Acessando os atributos das tags XML...............................68 Funções da SimpleXML...................................................68 Funções PHP/XSLT para transformação................................. 69 Lista dos elementos da XSLT................................................. 72 Informações adicionais..........................................................77 Download dos exemplos do guia......................................77 Links relacionados...........................................................77 Comentários e sugestões..................................................77 Índice remissivo.................................................................... 78



Conceitos básicos

Conceitos básicos O que é PHP? PHP é uma das linguagens de programação mais utilizadas na web para a criação de páginas dinâmicas. Suas principais características são: • Gratuito e com código aberto: o arquivo de instalação pode ser adquirido gratuitamente no site http://www.php.net. Além disso, o PHP é um software com código-fonte aberto. O código-fonte, assim como a sua documentação detalhada, também estão disponíveis no site oficial do PHP. • Embutido no HTML: o HTMLe o PHP estão misturados.Você pode começar a escrever em PHP, de repente escrever um trecho em HTML, depois voltar para o PHP, e assim por diante. • Baseado no servidor: quando você acessa uma página PHP através do seu navegador, todo o código PHP é executado no servidor, e somente o resultado final é exibido para o usuário. Portanto, o navegador exibe a página já processada, sem consumir recursos de seu computador. Além disso, ao contrário da linguagem Javascript, as linhas de programação PHP não podem ser vistas por ninguém, pois elas são executadas no próprio servidor e o que retorna é apenas o resultado do código executado. • Bancos de dados: diversos bancos de dados são suportados pelo PHP, ou seja, o PHP possui código que executa funções de cada um. Entre eles temos PostgreSQL, Sybase, MySQL, Oracle, SQL Server e muitos outros. • Portabilidade: pode-se executar o PHP no Linux, Unix ou Windows NT. A seguir é apresentado um exemplo de uma página Web que contém programação PHP: <html> <head> <title>Exemplo</title> </head> <body> <?php echo "Este é um script PHP!"; ?> </body> </html>

Perceba que um trecho de programa PHP deve iniciar com <?php e terminar com ?>. O programa apresentado contém a estrutura padrão de uma página HTML, com os elementos html, body, head e title. No corpo da página há um trecho de código PHP, onde foi utilizado o comando echo para exibir na tela o texto "Este é um script PHP!". Para aprender mais sobre PHP você pode


Conceitos básicos

consultar alguns livros dedicados a essa linguagem, como o "Desenvolvendo Websites com PHP", da Novatec Editora.

O que é XML? A XML (Extensible Markup Language) permite que você crie os seus próprios conjuntos de elementos de marcação. A XML busca executar o que seria a verdadeira função de uma linguagem de marcação: descrever o conteúdo de um documento, e não como ele deve ser exibido. Com as marcações personalizadas da XML torna-se possível a estruturação dos dados, que posteriormente poderão ser recuperados facilmente e utilizados de diversas maneiras. A seguir é apresentado um exemplo de documento XML, que iremos nomear como futebol.xml: <?xml version="1.0"?> <futebol> <jogador> <nome>Mauro Galvão</nome> <idade>40</idade> <altura>1.80</altura> <time>Grêmio</time> <posicao>Zagueiro</posicao> </jogador> <jogador> <nome>Kléber</nome> <idade>25</idade> <altura>1.78</altura> <time>Atlético-PR</time> <posicao>Meio-campo</posicao> </jogador> <jogador> <nome>Adãozinho</nome> <idade>34</idade> <altura>1.68</altura> <time>São Caetano</time> <posicao>Meio-campo</posicao> </jogador> </futebol>

O documento apresentando armazena, de forma estruturada, dados referentes a alguns jogadores de futebol. Você pode obter mais informações sobre XML no site do W3C, no endereço http://www.w3.org/XML, ou no guia de XML publicado pela Novatec Editora (http://novateceditora.com.br/guias/xml/).

Usando PHP com XML O principal objetivo deste Guia é ensinar como trabalhar de forma conjunta com PHP e XML, ou seja, ensinar a utilizar a linguagem PHP para extrair e exibir com determinada formatação os dados contidos em documentos XML. Em outras palavras, você irá aprender a criar um analisador (parser) XML para tratar de alguma forma os dados existentes nesses documentos.


Conceitos básicos

No decorrer do Guia discutiremos cada etapa do processo de análise de um documento XML com PHP. Para já ir se acostumando, observe o trecho de código PHP a seguir, que simplesmente exibe na tela (em formato HTML) os dados contidos no documento futebol.xml, apresentado no item anterior: <html> <head> <title>Jogadores de futebol</title> </head> <body> <h2>Jogadores</h2> <? function TagInicial($parser, $elemento, $attrs) { if($elemento!="FUTEBOL") if($elemento=="JOGADOR") echo "<ul>"; else echo "<li>"; } function TagFinal($parser, $elemento) { if($elemento!="FUTEBOL") if($elemento=="JOGADOR") echo "</ul>"; else echo «</li>»; } function TrataCaracteres($parser, $dados) { echo $dados; } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "TagInicial", "TagFinal"); xml_set_character_data_handler($xml_parser, "TrataCaracteres"); if (!($fp = fopen("futebol.xml", "r"))) die("Não foi possível abrir o arquivo XML."); while ($dados = fread($fp, 4096)) { if (!xml_parse($xml_parser, $dados, feof($fp))) { die(sprintf("Erro XML: %s na linha %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); ?> </body> </html>

O script PHP apresentado, que foi nomeado como futebol. php, exibe em forma de itens (elemento li da HTML) os dados referentes a cada jogador armazenado no documento futebol.xml. O resultado produzido pela execução desse script é apresentado na figura a seguir. No tópico "Analisando um documento XML com PHP" na página 9, você aprenderá detalhadamente cada etapa do processo


Conceitos básicos

de análise, juntamente com algumas técnicas de programação que facilitam a formatação dos dados recuperados.

Instalando a extensão expat A extensão que possibilita a análise de documentos XML a partir do PHP é chamada de expat, e foi criada por James Clark. A expat permite a criação de parsers XML e a definição de funções de manipulação para diversos tipos de eventos XML. Essas funções, chamadas de handlers, são definidas por funções como xml_set_element_handler, xml_set_character_data_handler, xml_set_processing_instruction_handler, entre outras. Provavelmente você não terá que instalar essa extensão, pois se o PHP estiver sendo executado no servidor Web Apache 1.3.7 ou posterior, a expat já estará disponível. Nesse caso basta configurar o PHP com —with-xml para que a extensão seja integrada ao Apache. Caso o PHP tenha sido compilado como um módulo do Apache 1.3.9 ou posterior, a extensão expat embutida no Apache será automaticamente utilizada. No entanto, se você estiver utilizando uma versão do Apache anterior à 1.3.7, ou outro servidor web que não ofereça o suporte necessário, haverá a necessidade de fazer o download e instalar a expat, que pode ser obtida em http://www.jclark.com/xml/. A documentação do PHP adverte que o arquivo Makefile que acompanha a extensão expat não cria uma biblioteca, e recomenda a seguinte regra para executar essa tarefa: libexpat.a: $(OBJS) ar -rc $@ $(OBJS) ranlib $@

Se preferir, pode fazer o download da expat em um pacote RPM ou em arquivo executável (para Windows) acessando o endereço http://sourceforge.net/projects/expat/.


Analisando um documento XML com PHP

Analisando um documento XML com PHP Agora você aprenderá com detalhes cada etapa do processo de análise de um documento XML, desde a criação de um analisador (parser) XML até a liberação da memória ocupada por ele. Nos trechos de códigos apresentados a seguir, considere os três pontos (...) como um trecho de código PHP que no momento não vem ao caso. O exemplo completo estará nomeado como futebol2.php, disponível para download no endereço indicado no final deste guia.

Criando um parser XML Em um script PHP, para iniciar a análise de um documento XML, é necessário que seja criado um parser. Essa tarefa é executada pela função xml_parser_create(), cujo resultado deve ser atribuído a uma variável que será utilizada toda vez que houver a necessidade de referenciar esse parser. Portanto, precisamos de uma única linha de código PHP: <?php ... $xml_parser = xml_parser_create(); ... ?>

A variável $xml_parser receberá um valor inteiro que representa o identificador do parser XML no script PHP que está em execução. As diversas funções relacionadas com a análise XML irão utilizar esse valor como referência.

Definindo as funções de manipulação Após a criação do parser devem ser definidas as funções (handlers) que irão manipular os principais eventos gerados durante a análise do documento XML. Os principais handlers são definidos pelas funções: xml_set_element_handler xml_set_character_data_handler

Porém, para a definição de handlers também existem as seguintes funções: xml_set_processing_instruction_handler xml_set_default_handler xml_set_unparsed_entity_decl_handler xml_set_notation_decl_handler xml_set_external_entity_ref_handler

Todas elas serão vistas com detalhes no tópico "Funções PHP para um parser XML" na página 49. Neste tópico serão apresentadas as duas principais, como mostra o seguinte trecho de código:


10

Analisando um documento XML com PHP

<? ... // cria o parser $xml_parser = xml_parser_create(); // define funções de manipulação xml_set_element_handler($xml_parser, "TagInicial", "TagFinal"); xml_set_character_data_handler($xml_parser, "TrataCaracteres"); ... ?>

É importante dizer que as funções de manipulação devem estar definidas antes que sejam executadas as funções xml_ set_element_handler e xml_set_character_data_handler. Portanto, no exemplo apresentado, primeiro devem ser criadas as funções TagInicial, TagFinal e TrataCaracteres, para posteriormente serem definidas como funções de manipulação. A função TagInicial será responsável por executar uma determinada ação quando o parser XML encontrar a tag inicial de algum elemento. Considerando o documento futebol.xml apresentado no início deste guia, a função TagInicial seria ativada quando o parser encontrasse as seguintes tags: <futebol> <jogador> <nome> <idade> <altura> <time> <posicao>

A função TagFinal executará uma determinada ação quando o parser XML encontrar as tags de fechamento para os elementos que compõe o documento. No nosso exemplo, as tags de fechamento serão as seguintes: </futebol> </jogador> </nome> </idade> </altura> </time> </posicao>

A função TrataCaracteres será responsável por tratar de alguma forma os caracteres encontrados entre as tags de abertura e fechamento. A função TagInicial deve possuir três parâmetros: • Identificador do parser XML que ativou esta função. • Nome do elemento para o qual esta função foi chamada. • Um array associativo contendo os atributos (caso existam) do elemento. Os nomes dos atributos são utilizados como chaves para acessar os seus valores. Por exemplo:


Analisando um documento XML com PHP

11

<?php function TagInicial($parser, $elemento, $attrs) { if($elemento=="FUTEBOL") echo "<table bgcolor=#00FF00>"; else if($elemento=="JOGADOR") echo "<tr><td><ul>"; else echo "<li>"; } ?>

Dessa forma, quando o parser XML encontrar a tag <futebol>, a função TagInicial criará uma tabela HTML com o plano de fundo verde. Ao encontrar a tag <jogador> será criada uma célula da tabela HTML, e dentro dela uma lista não-ordenada (elemento ul). Para as demais tags iniciais será impresso um marcador de item da lista (elemento li). Antes de apresentar a função responsável pelo fechamento de todas essas tags veremos a função TrataCaracteres, que trata de alguma forma os dados contidos entre as tags inicial e final de um elemento. A função TrataCaracteres deve possuir dois parâmetros: • Identificador do parser XML que ativou esta função. • Os dados a serem tratados. Por exemplo: <?php function echo echo echo } ?>

TrataCaracteres($parser, $dados) { "<b>"; $dados; "</b>";

A função mostrada neste exemplo apenas exibe em negrito os dados recebidos. No entanto, poderia ser utilizada uma formatação diferente para cada dado, dependendo do elemento que está sendo analisado. Para isso, bastaria utilizar uma variável global para armazenar o elemento corrente, como veremos em um exemplo mais adiante. Após abrir algumas tags e tratar os dados recebidos, utilizamos a função TagFinal para executar alguma ação quando uma tag de fechamento for encontrada. Essa função deve possuir dois parâmetros: • Identificador do parser XML que ativou esta função. • Nome do elemento para o qual esta função foi chamada. Por exemplo: <?php function TagFinal($parser, $elemento) { if($elemento=="FUTEBOL") echo "</table>";


12 ?>

Analisando um documento XML com PHP }

else if($elemento=="JOGADOR") echo "</ul></td></tr>"; else echo "</li>";

Veja que, no exemplo que utilizamos, a função TagFinal é encarregada de gerar as tags de fechamento para as tags que foram abertas pela função TagInicial, enquanto a função TrataCaracteres é utilizada para imprimir, de modo formatado, os dados encontrados. Portanto, ao criar as funções que foram nomeadas como TagInicial, TagFinal e TrataCaracteres, e defini-las como funções de manipulação (handlers), estaremos tratando os principais eventos XML. Dessa forma pode-se utilizar a HTML para exibir no navegador, com uma determinada formatação, aqueles dados que estavam armazenados de forma estruturada no documento XML.

Mapeamento de tags XML Para facilitar a conversão de dados estruturados (em XML) para dados formatados (em HTML), pode ser feito um mapeamento de tags. Esse mapeamento consiste em definir os códigos HTML que devem ser exibidos para cada tag encontrada no documento XML. Para deixar o código mais fácil de entender, em vez de usar vários comandos if encadeados, isso pode ser feito de duas formas: • Com o comando switch do PHP. • Criando um array associativo, onde as chaves correspondem ao nome dos elementos e os valores são os códigos HTML correspondentes a cada tag. Agora veremos como implementar cada uma das formas. A primeira será gravada em um arquivo chamado futebol3.php e a segunda no arquivo futebol4.php, também disponíveis para download no endereço indicado no final desse guia. Utilizando o comando switch para fazer o mapeamento, as funções de manipulação poderiam ser as seguintes: <? function TagInicial($parser, $elemento, $attrs) { switch ($elemento) { case "FUTEBOL": echo "<table bgcolor=#F0F0F0>"; break; case "JOGADOR": echo "<tr><td>"; break; case "NOME": echo "<b>"; break;


Analisando um documento XML com PHP

13

case "IDADE": echo "Idade: <i>"; break; case "ALTURA": echo "Altura: <i>"; break; case "TIME": echo "Time: <u>"; break; case "POSICAO": echo "Posição: <i>"; break; default: break; } } function TagFinal($parser, $elemento) { switch ($elemento) { case "FUTEBOL": echo "</table>"; break; case "JOGADOR": echo "</td></tr>"; break; case "NOME": echo "</b><br>"; break; case "IDADE": echo "</i><br>"; break; case "ALTURA": echo "</i><br>"; break; case "TIME": echo "</u><br>"; break; case "POSICAO": echo "</i><br><br>"; break; default: break; } } function TrataCaracteres($parser, $dados) { echo $dados; } ... ?>

Na segunda maneira de implementar o mapeamento de tags utiliza-se dois arrays associativos globais, sendo um para mapear as tags de abertura e outro as tags de fechamento. Dessa forma, as funções de manipulação podem acessar diretamente a posição do array correspondente ao elemento que está sendo analisado. Então o script PHP poderia ser definido da seguinte forma:


14

Analisando um documento XML com PHP

<? $inicial = array ('FUTEBOL' => '<table bgcolor=#F0F0F0>', 'JOGADOR' => '<tr><td>', 'NOME' => '<b>', 'IDADE' => 'Idade: <i>', 'ALTURA' => 'Altura: <i>', 'TIME' => 'Time: <u>', 'POSICAO' => 'Posição: <i>'); $final = array ('FUTEBOL' => '</table>', 'JOGADOR' => '</td></tr>', 'NOME' => '</b><br>', 'IDADE' => '</i><br>', 'ALTURA' => '</i><br>', 'TIME' => '</u><br>', 'POSICAO' => '</i><br><br>'); function TagInicial($parser, $elemento, $attrs) { global $inicial; echo $inicial[$elemento]; } function TagFinal($parser, $elemento) { global $final; echo $final[$elemento]; } function TrataCaracteres($parser, $dados) { echo $dados; } ... ?>

As duas formas produzem o mesmo resultado no programa navegador, como mostra a figura seguinte:

Ao escolher a opção "Exibir – Código-fonte" no browser, verá que os códigos HTML gerados pelas páginas futebol3.php e futebol4.php são idênticos. Veja a seguir o código gerado: <table bgcolor=#F0F0F0> <tr><td> <b>Mauro Galvão</b><br>


Analisando um documento XML com PHP

15

Idade: <i>40</i><br> Altura: <i>1.80</i><br> Time: <u>Grêmio</u><br> Posição: <i>Zagueiro</i><br><br> </td></tr> <tr><td> <b>Kléber</b><br> Idade: <i>25</i><br> Altura: <i>1.78</i><br> Time: <u>Atlético-PR</u><br> Posição: <i>Meio-campo</i><br><br> </td></tr> <tr><td> <b>Adãozinho</b><br> Idade: <i>34</i><br> Altura: <i>1.68</i><br> Time: <u>São Caetano</u><br> Posição: <i>Meio-campo</i><br><br> </td></tr> </table>

Portanto, fizemos um mapeamento das tags do documento futebol.xml, atribuindo uma determinada formatação HTML para cada tag encontrada. Para o elemento FUTEBOL foi criada uma tabela com plano de fundo cinza; para o elemento JOGADOR foi criada uma célula na tabela; para o elemento NOME o texto foi formatado com negrito, e assim por diante.

Executando o parser e manipulando erros Já vimos como criar um parser XMLcom a função xml_parser_create, e como definir as funções de manipulação (handlers) com as funções xml_set_element_handler e xml_set_character_data_handler.Mas para realmente iniciar a análise de um documento XMLprecisamos executar a função xml_parse. Sua sintaxe é a seguinte: int xml_parse (int parser, string dados [, int final])

O primeiro parâmetro é o identificador do parser XML, ou seja, a variável que recebeu o resultado da função xml_parser_create. O segundo parâmetro são os dados a serem analisados. O terceiro parâmetro é opcional, servindo para indicar se a análise do documento XML já chegou ao fim. Observe a seguir um exemplo de uso dessa função: <?php ... if (!($fp = fopen("futebol.xml", "r"))) die("Não foi possível abrir o arquivo XML."); while ($dados = fread($fp, 4096)) xml_parse($xml_parser, $dados, feof($fp)); ... ?>

No trecho de código apresentado, primeiramente é feita a tentativa de abrir o arquivo futebol.xml para leitura. Caso o arquivo seja aberto com sucesso, será executado um comando


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.