W3docs

xml_parser_create()

La funzione xml_parser_create() è una funzione built-in di PHP che crea un nuovo parser XML per l'analisi SAX event-driven.

La funzione xml_parser_create() è una funzione built-in di PHP che crea un nuovo parser XML. Appartiene all'estensione legacy xml (Expat) e viene utilizzata per l'analisi in stile SAX (event-driven). A differenza di estensioni di livello superiore come SimpleXML o DOMDocument, questo parser elabora i dati XML in modo sequenziale attivando funzioni di callback definite dall'utente per elementi, attributi e dati di testo.

La funzione xml_parser_create() è utile quando è necessario analizzare in streaming file XML di grandi dimensioni, estrarre dati specifici senza caricare l'intero documento in memoria, oppure elaborare XML in modo a basso livello e guidato dagli eventi.

La funzione restituisce un parser XML che si memorizza in una variabile e si passa a tutte le altre funzioni xml_*. A partire da PHP 8.0 restituisce un oggetto XMLParser; nelle versioni precedenti restituiva una resource. In entrambi i casi lo si tratta come un handle opaco — si impostano handler su di esso, si alimentano i dati con xml_parse(), quindi lo si rilascia con xml_parser_free().

Sintassi

La sintassi della funzione xml_parser_create() è la seguente:

sintassi della funzione xml_parser_create()

xml_parser_create([$encoding])

Dove $encoding è la codifica dei caratteri utilizzata dai dati XML (ad esempio "UTF-8", "ISO-8859-1" o "US-ASCII"). Questo parametro è opzionale; se omesso, il parser rileva la codifica dalla dichiarazione XML del documento.

Esempi di utilizzo

Vediamo alcuni esempi pratici di utilizzo di xml_parser_create() in PHP.

Esempio 1: Creazione di un parser XML

È possibile utilizzare la funzione xml_parser_create() per inizializzare una risorsa parser. Si noti che la sola creazione del parser non elabora alcun dato; è necessario configurare gli handler e chiamare xml_parse() per effettivamente analizzare l'XML.

usare la funzione xml_parser_create() per creare un nuovo parser XML in PHP

$xml_parser = xml_parser_create();

Questo codice crea una nuova risorsa parser XML. Di per sé è solo un contenitore vuoto pronto per essere configurato.

Esempio 2: Analisi di dati XML

Per analizzare effettivamente l'XML, è necessario configurare gli handler degli eventi e alimentare i dati al parser tramite xml_parse().

usare la funzione xml_parser_create() per analizzare dati XML in 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);

Questo codice crea un parser, registra callback per i tag di apertura e chiusura, e utilizza xml_parse() per elaborare il file XML. Il parser attiva le callback mentre legge i dati in modo sequenziale.

Esempio 3: Estrazione di dati da XML inline

Questo esempio autonomo analizza una stringa XML e raccoglie il testo di ciascun elemento in un array usando un handler per i dati di carattere. Funziona così com'è, senza alcun file esterno.

estrarre dati da XML usando l'estensione xml in 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);

Output:

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

Si noti che le chiavi sono in maiuscolo. Per impostazione predefinita, il parser Expat converte i nomi degli elementi in maiuscolo, motivo per cui l'handler memorizza TITLE e AUTHOR invece di title e author. Per mantenere le maiuscole/minuscole originali, disabilita il case folding subito dopo aver creato il parser:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

L'handler per i dati di carattere può anche essere attivato più volte per elemento (ad esempio quando il testo è diviso da entità o interruzioni di riga), quindi questo esempio concatena con la logica .= — qui una singola assegnazione è sufficiente perché ogni valore è una stringa breve.

xml_parser_create() è progettata per l'analisi event-driven e non esegue la validazione dello schema. Per la validazione XSD, si consigliano le estensioni di livello superiore DOMDocument o SimpleXML.

Conclusione

In questo articolo, abbiamo discusso la funzione xml_parser_create() di PHP e come può essere utilizzata per creare un nuovo parser XML in stile SAX. Abbiamo spiegato cosa fa la funzione, la sua sintassi e fornito esempi su come configurare gli handler e analizzare i dati XML in modo sequenziale. Seguendo questi esempi, è possibile analizzare in streaming file XML ed estrarre dati specifici nelle proprie applicazioni PHP in modo efficiente. Per la maggior parte dei casi d'uso moderni, considera l'utilizzo di SimpleXML o DOMDocument, che forniscono API di livello superiore e validazione integrata senza richiedere la configurazione manuale del parser.

Funzioni correlate

Pratica

Pratica
Qual è il modo corretto per creare un parser XML in PHP?
Qual è il modo corretto per creare un parser XML in PHP?
Was this page helpful?