xml_parser_create()
A função xml_parser_create() do PHP cria um novo analisador XML no estilo SAX (orientado a eventos) usando a extensão Expat legada.
A função xml_parser_create() é uma função integrada do PHP que cria um novo analisador XML. Ela pertence à extensão legada xml (Expat) e é utilizada para análise no estilo SAX (orientada a eventos). Ao contrário de extensões de alto nível como SimpleXML ou DOMDocument, este analisador processa os dados XML sequencialmente, acionando funções de retorno de chamada definidas pelo usuário para elementos, atributos e dados de caracteres.
A função xml_parser_create() é útil quando você precisa analisar grandes arquivos XML por streaming, extrair dados específicos sem carregar o documento inteiro na memória, ou processar XML de forma sequencial e orientada a eventos.
A função retorna um analisador XML que você armazena em uma variável e passa para todas as demais funções xml_*. A partir do PHP 8.0, ela retorna um objeto XMLParser; em versões anteriores, retornava um resource. De qualquer forma, você o trata como um identificador opaco — defina os manipuladores, alimente os dados com xml_parse() e, por fim, libere-o com xml_parser_free().
Sintaxe
A sintaxe da função xml_parser_create() é a seguinte:
sintaxe da função xml_parser_create()
xml_parser_create([$encoding])Onde $encoding é a codificação de caracteres utilizada pelos dados XML (por exemplo, "UTF-8", "ISO-8859-1" ou "US-ASCII"). Este parâmetro é opcional; quando omitido, o analisador detecta a codificação a partir da declaração XML do documento.
Exemplos de Uso
Vamos ver alguns exemplos práticos de uso do xml_parser_create() em PHP.
Exemplo 1: Criando um Analisador XML
Você pode usar a função xml_parser_create() para inicializar um recurso de analisador. Observe que criar o analisador sozinho não processa nenhum dado; você deve configurar os manipuladores e chamar xml_parse() para de fato analisar o XML.
use a função xml_parser_create() para criar um novo analisador XML em PHP
$xml_parser = xml_parser_create();Este código cria um novo recurso de analisador XML. Por si só, é apenas um contêiner vazio pronto para ser configurado.
Exemplo 2: Analisando Dados XML
Para realmente analisar XML, você precisa configurar manipuladores de eventos e alimentar os dados no analisador usando xml_parse().
use a função xml_parser_create() para analisar dados XML em PHP
$xml_parser = xml_parser_create();
$xml_data = file_get_contents("data.xml");
// Set up element handlers
xml_set_element_handler($xml_parser, function($parser, $name) {
echo "Start element: $name\n";
}, function($parser, $name) {
echo "End element: $name\n";
});
// Parse the data
if (!xml_parse($xml_parser, $xml_data, true)) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
xml_parser_free($xml_parser);Este código cria um analisador, registra retornos de chamada para tags de abertura e fechamento, e usa xml_parse() para processar o arquivo XML. O analisador aciona os retornos de chamada conforme lê os dados sequencialmente.
Exemplo 3: Extraindo Dados de XML Inline
Este exemplo autocontido analisa uma string XML e coleta o texto de cada elemento em um array usando um manipulador de dados de caracteres. Ele é executado tal como está, sem nenhum arquivo externo.
extraia dados de XML usando a extensão xml em PHP
$xml_data = <<<XML
<?xml version="1.0"?>
<book>
<title>Learn PHP</title>
<author>W3docs</author>
</book>
XML;
$xml_parser = xml_parser_create();
$current_tag = '';
$book = [];
xml_set_element_handler(
$xml_parser,
function ($parser, $name) use (&$current_tag) {
$current_tag = $name; // element names arrive UPPERCASE by default
},
function ($parser, $name) use (&$current_tag) {
$current_tag = '';
}
);
xml_set_character_data_handler(
$xml_parser,
function ($parser, $data) use (&$current_tag, &$book) {
$data = trim($data);
if ($current_tag !== '' && $data !== '') {
$book[$current_tag] = $data;
}
}
);
xml_parse($xml_parser, $xml_data, true);
xml_parser_free($xml_parser);
print_r($book);Saída:
Array
(
[TITLE] => Learn PHP
[AUTHOR] => W3docs
)Observe que as chaves estão em maiúsculas. Por padrão, o analisador Expat converte os nomes dos elementos para maiúsculas, razão pela qual o manipulador armazena TITLE e AUTHOR em vez de title e author. Para manter o caso original, desative o folding de maiúsculas logo após criar o analisador:
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);O manipulador de dados de caracteres também pode ser acionado várias vezes por elemento (por exemplo, quando o texto é dividido por entidades ou quebras de linha), portanto este exemplo concatena com lógica no estilo .= — aqui uma única atribuição é suficiente porque cada valor é uma string curta.
xml_parser_create() é projetado para análise orientada a eventos e não realiza validação de esquema. Para validação XSD, as extensões de nível superior DOMDocument ou SimpleXML são recomendadas.
Conclusão
Neste artigo, discutimos a função xml_parser_create() do PHP e como ela pode ser usada para criar um novo analisador XML no estilo SAX. Explicamos o que a função faz, sua sintaxe e fornecemos exemplos de como configurar manipuladores e analisar dados XML sequencialmente. Seguindo esses exemplos, você pode analisar arquivos XML por streaming de forma eficiente e extrair dados específicos em suas aplicações PHP. Para a maioria dos casos de uso modernos, considere usar SimpleXML ou DOMDocument, que oferecem APIs de nível mais alto e validação integrada sem exigir configuração manual do analisador.
Funções Relacionadas
xml_parser_create_ns()— cria um analisador XML com suporte a namespaces.xml_parse()— alimenta dados XML no analisador e aciona os manipuladores.xml_set_element_handler()— registra retornos de chamada para tags de abertura e fechamento.xml_set_character_data_handler()— registra um retorno de chamada para conteúdo de texto.xml_parser_set_option()— altera opções do analisador, como o folding de maiúsculas.xml_parser_free()— libera o analisador quando você terminar.xml_error_string()— obtém uma mensagem legível para um erro de análise.