Corsi on-line

Accedere ai valori di CDATA in XML con DOM e PHP

All’interno di un documento XML tutti i testi subiranno una scansione tramite parser, ciò però non vale per il contenuto della sezione CDATA che verrà ignorato dal parser; è comunque possibile accedere ai valori associati a CDATA tramite DOM e PHP. Ciò avverrà grazie al coinvolgimento delle classi DOMNode, DOMElement e DOMDocument.

xml
DOMNode è la classe di base che potrà essere inizializzata per lavorare su un qualsiasi tipo di nodo in un documento XML, sia esso un testo, un commento o una sezione CDATA; diversa la funzione svolta da DOMElement che è invece la classe di base per i tag; DOMDocument, infine, è la classe di base per i documenti e delimita i metodi per il caricamento e il salvataggio di XML.

Veniamo quindi ai metodi chiamati in causa per l’accesso ai valori di CDATA. Dopo la generazione di un nuovo DOMDocument, DOMDocument->load() potrà essere utilizzato su tale oggetto per il caricamento da file; DOMDocument->getElementsByTagName() restituisce invece un elenco iterabile di tutti gli elementi di un nodo associati ad uno specifico tag; DOMNode->childNodes svolge la funzione di listare i figli di un nodo, mentre DOMNode->nodeType si riferisce al tipo di un nodo e DOMNode->textContent al testo di un nodo.

Nel caso specifico di CDATA (che è a sua volta un nodo), si avrà un tipo XML_CDATA_SECTION_NODE che ha come valore costante “4”; ora, si prenda per esempio un listato come il seguente:

<Sviluppo>
        <Linguaggio>
            <![CDATA[JavaScript, Ajax, Html]]>
            <Lato>Client</Lato>
        </Linguaggio>
        <Linguaggio>
            <![CDATA[Php, Jsp]]>
            <Lato>Server</Lato>
        </Linguaggio>
  </Sviluppo>

Ora, quello che si potrà fare tramite PHP è creare un nuovo oggetto del documento e caricare l’XML, identificare tutti gli elementi Linguaggio tramite il nome tag, iterare i nodi figlio di ciascun elemento Linguaggio, rilevare se il tipo di nodo è XML_CDATA_SECTION_NODE e restituire il contenuto del nodo. Ecco come:

$xml = new DOMDocument();
$xml->load('nomefile.xml');
$linguaggi = $xml->getElementsByTagName("Linguaggio");
foreach ($linguaggi as $linguaggio) {
    foreach($linguaggio->childNodes as $figlio) {
        if ($figlio->nodeType == XML_CDATA_SECTION_NODE) {
            echo $figlio->textContent . "<br/>";
        }
    }
}

L’output generato dallo script proposto in esempio sarà composto dai valori associati alle due sezioni CDATA del documento XML:

JavaScript, Ajax, Html
Php, Jsp
Post correlati
I più letti del mese
Tematiche