W3docs

xml_parser_create()

La función xml_parser_create() crea un nuevo analizador XML en PHP para procesamiento SAX secuencial basado en eventos con callbacks personalizados.

La función xml_parser_create() es una función integrada de PHP que crea un nuevo analizador XML. Pertenece a la extensión heredada xml (Expat) y se utiliza para el análisis de estilo SAX (orientado a eventos). A diferencia de extensiones de mayor nivel como SimpleXML o DOMDocument, este analizador procesa los datos XML de forma secuencial activando funciones de callback definidas por el usuario para elementos, atributos y datos de caracteres.

La función xml_parser_create() es útil cuando necesitas analizar por streaming archivos XML de gran tamaño, extraer datos específicos sin cargar todo el documento en memoria, o procesar XML de forma de bajo nivel y orientada a eventos.

La función devuelve un analizador XML que se almacena en una variable y se pasa a todas las demás funciones xml_*. A partir de PHP 8.0 devuelve un objeto XMLParser; en versiones anteriores devolvía un resource. En cualquier caso se trata como un identificador opaco: se configuran los manejadores, se alimenta con datos mediante xml_parse() y luego se libera con xml_parser_free().

Sintaxis

La sintaxis de la función xml_parser_create() es la siguiente:

sintaxis de la función xml_parser_create()

xml_parser_create([$encoding])

Donde $encoding es la codificación de caracteres utilizada por los datos XML (por ejemplo "UTF-8", "ISO-8859-1" o "US-ASCII"). Este parámetro es opcional; cuando se omite, el analizador detecta la codificación a partir de la declaración XML del documento.

Ejemplos de uso

Veamos algunos ejemplos prácticos del uso de xml_parser_create() en PHP.

Ejemplo 1: Crear un analizador XML

Puedes usar la función xml_parser_create() para inicializar un recurso de analizador. Ten en cuenta que crear el analizador por sí solo no procesa ningún dato; debes configurar los manejadores y llamar a xml_parse() para analizar el XML realmente.

usar la función xml_parser_create() para crear un nuevo analizador XML en PHP

$xml_parser = xml_parser_create();

Este código crea un nuevo recurso de analizador XML. Por sí solo, es simplemente un contenedor vacío listo para configurarse.

Ejemplo 2: Analizar datos XML

Para analizar XML de verdad, necesitas configurar manejadores de eventos y alimentar datos al analizador usando xml_parse().

usar la función xml_parser_create() para analizar datos XML en 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 crea un analizador, registra callbacks para etiquetas de apertura y cierre, y utiliza xml_parse() para procesar el archivo XML. El analizador activa los callbacks mientras lee los datos de forma secuencial.

Ejemplo 3: Extraer datos de XML en línea

Este ejemplo autocontenido analiza una cadena XML y recopila el texto de cada elemento en un array usando un manejador de datos de caracteres. Funciona tal cual, sin ningún archivo externo.

extraer datos de XML usando la extensión xml en 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);

Salida:

Array
(
    [TITLE] => Learn PHP
    [AUTHOR] => W3docs
)

Observa que las claves están en mayúsculas. Por defecto, el analizador Expat convierte los nombres de elementos a mayúsculas, razón por la cual el manejador almacena TITLE y AUTHOR en lugar de title y author. Para mantener el uso de mayúsculas y minúsculas original, desactiva el plegado de mayúsculas justo después de crear el analizador:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

El manejador de datos de caracteres también puede dispararse varias veces por elemento (por ejemplo, cuando el texto está dividido por entidades o saltos de línea), por lo que este ejemplo concatena con lógica de estilo .= — aquí una sola asignación es suficiente porque cada valor es una cadena corta.

xml_parser_create() está diseñado para el análisis orientado a eventos y no realiza validación de esquemas. Para la validación XSD, se recomiendan las extensiones de mayor nivel DOMDocument o SimpleXML.

Conclusión

En este artículo, hemos analizado la función xml_parser_create() de PHP y cómo puede usarse para crear un nuevo analizador XML de estilo SAX. Hemos explicado qué hace la función, su sintaxis y proporcionado ejemplos de cómo configurar manejadores y analizar datos XML de forma secuencial. Siguiendo estos ejemplos, puedes analizar por streaming archivos XML de manera eficiente y extraer datos específicos en tus aplicaciones PHP. Para la mayoría de los casos de uso modernos, considera usar SimpleXML o DOMDocument, que proporcionan APIs de mayor nivel y validación integrada sin requerir configuración manual del analizador.

Funciones relacionadas

Práctica

Práctica
¿Cuál es la forma correcta de crear un analizador XML en PHP?
¿Cuál es la forma correcta de crear un analizador XML en PHP?
Was this page helpful?