getNamespaces()
Scopri come getNamespaces() di PHP restituisce i namespace in scope per un elemento XML, con sintassi, esempio eseguibile e differenze da getDocNamespaces().
Introduzione
SimpleXML è un'estensione PHP che fornisce un'API semplice e orientata agli oggetti per leggere documenti XML. Quando un documento XML utilizza i namespace — ad esempio <bk:title> dove bk è associato a una URI — spesso è necessario sapere quali namespace un dato elemento dichiara o eredita. Il metodo SimpleXMLElement::getNamespaces() risponde esattamente a questa domanda: restituisce i namespace che sono in scope per un elemento. Questo articolo ne spiega la sintassi, mostra un esempio eseguibile e chiarisce come si differenzia dal correlato getDocNamespaces().
Comprendere la funzione SimpleXMLElement::getNamespaces()
getNamespaces() restituisce un array associativo dei namespace utilizzati in un elemento — ovvero i prefissi (e il namespace predefinito, con chiave stringa vuota) che si applicano effettivamente al nodo e, facoltativamente, ai suoi discendenti. La sintassi segue il formato ufficiale del manuale PHP:
SimpleXMLElement::getNamespaces ( bool $recursive = false ) : arrayQui, $recursive è opzionale. Lasciato al valore predefinito false, il metodo riporta solo i namespace in uso sull'elemento corrente. Impostato a true, percorre anche i figli dell'elemento e include i namespace da essi utilizzati. L'array restituito mappa ogni prefisso alla sua URI di namespace.
Vale la pena confrontare due metodi simili:
getNamespaces()restituisce i namespace effettivamente utilizzati dall'elemento (e facoltativamente dai suoi figli).getDocNamespaces()restituisce ogni namespace dichiarato nel documento, che sia usato o meno.
Esempio di utilizzo
Vediamo un esempio per capire come funziona SimpleXMLElement::getNamespaces() in PHP:
Nell'esempio precedente, creiamo un SimpleXMLElement da un elemento <book> il cui figlio <bk:title> utilizza il namespace bk associato a https://example.com/books. Passando true a getNamespaces() si fa ricorrere il metodo nei figli, quindi il namespace bk usato da <bk:title> viene incluso. Si itera poi sull'array restituito e si stampa ogni prefisso insieme alla sua URI. L'output è:
Prefix: bk, URI: https://example.com/booksSe avessimo chiamato getNamespaces(false), l'array sarebbe vuoto, perché l'elemento radice <book> non usa il prefisso bk — lo usa solo il suo figlio.
Conclusione
Il metodo SimpleXMLElement::getNamespaces() è uno strumento mirato per scoprire quali namespace sono effettivamente in scope per un elemento. Usalo (con $recursive = true) quando vuoi i namespace su cui un elemento e i suoi figli fanno affidamento, e ricorri a getDocNamespaces() quando hai bisogno di ogni namespace dichiarato nel documento. Per sapere come interrogare i nodi con namespace una volta noti i loro prefissi, consulta registerXPathNamespace().