Analizador Expat XML PHP

Recomendação de curso:

O analisador integrado Expat torna possível lidar com documentos XML no PHP.

O que é XML?

Em XML, não há tags pré-definidas. Você deve definir suas próprias tags.

Se quiser aprender mais sobre XML, acesse nosso Tutorial XML.

O que é o Expat?

Para ler e atualizar - criar, processar, um documento XML, você precisa de um analisador XML.

Existem dois tipos básicos de analisadores XML:

  • Analisador baseado em árvore: esse analisador converte o documento XML em uma estrutura em árvore. Ele analisa todo o documento e fornece uma API para acessar os elementos da árvore, como o modelo de objeto de documento (DOM).
  • Analisador baseado em eventos: considera o documento XML como uma série de eventos. Quando um evento específico ocorre, o analisador chama funções para lidar com isso.

Analisador baseado em eventos

O analisador baseado em eventos se concentra no conteúdo do documento XML, não em seus resultados. Por isso, o analisador baseado em eventos pode acessar dados mais rapidamente do que o analisador baseado em árvore.

Veja o seguinte trecho XML:

<from>John</from>

O analisador baseado em eventos reporta o XML acima como uma série de três eventos:

  • Iniciar elemento: from
  • Iniciar seção CDATA, valor: John
  • Fechar elemento: from

O exemplo XML acima contém XML bem formado. No entanto, este exemplo é XML inválido, pois não possui declaração de tipo de documento (DTD) associada nem DTD embebida.

No entanto, isso não faz diferença ao usar o analisador Expat. O Expat não verifica a validade e ignora qualquer DTD.

Como um analisador XML baseado em eventos e não validado, o Expat é rápido e leve, muito adequado para aplicações web PHP.

Nota:O documento XML deve estar bem formado, caso contrário, o Expat gerará erros.

Instalação

O analisador XML Expat é parte integrante do PHP. Não é necessário instalar para usar essas funções.

Arquivo XML

Vamos usar o seguinte arquivo XML em nosso exemplo:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Lembrete</heading>
<body>Não se esqueça da reunião!</body>
</note>

Inicializar analisador XML

Nós precisamos inicializar o analisador XML em PHP, definir manipuladores para diferentes eventos XML e então analisar este arquivo XML.

Exemplo

<?php
//Inicializar o analisador XML
$parser=xml_parser_create();
//Função a usar no início de um elemento
function start($parser,$element_name,$element_attrs)
  {
  switch($element_name)
    {
    case "NOTE":
    echo "-- Nota --<br />";
    break; 
    case "TO":
    echo "Para: ";
    break; 
    case "FROM":
    echo "De: ";
    break; 
    case "HEADING":
    echo "Título: ";
    break; 
    case "BODY":
    echo "Mensagem: ";
    }
  }
//Função a usar no final de um elemento
function stop($parser,$element_name)
  {
  echo "<br />";
  }
//Função a usar ao encontrar dados de caractere
function char($parser,$data)
  {
  echo $data;
  }
//Especificar manipulador de elemento
xml_set_element_handler($parser,"start","stop");
//Especificar manipulador de dados
xml_set_character_data_handler($parser,"char");
//Abrir arquivo XML
$fp=fopen("test.xml","r");
//Ler dados
while ($data=fread($fp,4096))
  {
  xml_parse($parser,$data,feof($fp)) ou 
  die (sprintf("Erro XML: %s na linha %d", 
  xml_error_string(xml_get_error_code($parser)),
  xml_get_current_line_number($parser)));
  }
//Liberar o parser XML
xml_parser_free($parser);
?>

Saída do código acima:

-- Nota --
Para: George
De: John
Título: Lembrança
Mensagem: Não se esqueça da reunião!

Explicação do Funcionamento:

  • Inicialize o parser XML através da função xml_parser_create()
  • Crie funções que se complementam com diferentes programas de tratamento de eventos
  • Adicione a função xml_set_element_handler() para definir qual função será executada quando o parser encontrar tags de início e fim
  • Adicione a função xml_set_character_data_handler() para definir qual função será executada quando o parser encontrar dados de caractere
  • Parse o arquivo "test.xml" através da função xml_parse()
  • Caso haja erro, adicione a função xml_error_string() para converter o erro XML em texto explicativo
  • Chame a função xml_parser_free() para liberar a memória alocada pela função xml_parser_create()

Mais informações sobre o parser PHP Expat

Para mais informações sobre as funções PHP Expat, acesse nosso manual de referência do Parser XML PHP.