PHP offre numerose funzioni per la gestione dei file XML tra cui quelle messe a disposizione da SimpleXML, prima però vediamo un esempio di questo tipo di file
Codice XML
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
l'elemento catalog è detto anche elemento radice, in particolare ogni elemento ha un marcatore di inizio e uno di fine, ad esempio l'elemento title viene specificato con
<title>Empire Burlesque</title>
e il suo valore e rappresentato dalla stringa "Empire Burlesque".
SimpleXML consente di leggere un documento XML da un file tramite la funzione simplexml_load_file() oppure da una stringa tramite la funzione simplexml_load_string().
Codice PHP
<?php
$xml=<<<XML
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
XML;
$catalog=simplexml_load_string($xml);
var_dump($catalog);
/*
Output
object(SimpleXMLElement)#1 (1)
{
["cd"]=> object(SimpleXMLElement)#2 (6)
{
["title"]=> string(16) "Empire Burlesque"
["artist"]=> string(9) "Bob Dylan"
["country"]=> string(3) "USA"
["company"]=> string(8) "Columbia"
["price"]=> string(5) "10.90"
["year"]=> string(4) "1985"
}
}
*/
come si nota in questo esempio di utilizzo della funzione simplexml_load_string(), l'output è un oggetto di tipo SimpleXMLElement, per recuperare il valore di un elemento, ad esempio price, si usa la seguente sintassi
<?php
//......
echo $catalog->cd->price;
Un elemento di un documento XML può contenere degli attributi, ad esempio aggiungiamo l'attributo currency="USD" all'elemento price
Codice PHP
$xml=<<<XML
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price currency="USD">10.90</price>
<year>1985</year>
</cd>
</catalog>
XML;
$catalog=simplexml_load_string($xml);
var_dump($catalog->cd->price);
/*
Output
object(SimpleXMLElement)#4 (2)
{
["@attributes"]=> array(1)
{
["currency"]=> string(3) "USD"
}
[0]=> string(5) "10.90"
}
*/
come si nota l'output dell'elemento price contiene la proprietà @attributes che è un array associativo contenente il nome dell'attributo (currency) e il suo valore (USD), pertanto per ottenere gli attributi di un elemento è sufficiente effettuare un loop all'interno dell'oggetto
Codice PHP
<?php
//...
foreach($catalog->cd->price->attributes() as $a => $b)
{
echo $a . '="' .$b . '"'; /* Output currency="USD" */
}
Se volessimo esportare l'oggetto $catalog in un file XML, è possibile farlo tramite la funzione asXML()
<?php
//----
file_put_contents('catalog.xml', $catalog->asXML());
verrà così generato un file xml (catalog.xml).
Fin qui abbiamo dato per scontato che non ci siano errori durante l'importazione di un documento XML, cioè se un documento XML contiene degli errrori di sintassi allora le funzioni simplexml_load_file() e simplexml_load_string() generano un errore di tipo E_WARNING, per gestire questo problema esistono due funzioni libxml_use_internal_errors() e libxml_get_errors(), la prima utilizzata per non visualizzare eventuali errori nell'output, mentre la seconda per restituire i messaggi di errore, ad esempio
Codice PHP
<?php
libxml_use_internal_errors(true);
$xml=<<<XML
<?xml version="1.0"?>
<a><b><c>
XML;
$catalog=simplexml_load_string($xml);
if ($catalog === false) {
$errors = libxml_get_errors();
printf("Failed load XML: ");
foreach($errors as $error){
printf("%s",$error->message);
}
}
/*
Output
Failed load XML:
Premature end of data in tag c line 2
Premature end of data in tag b line 2
Premature end of data in tag a line 2
*/
avendo modificato il documento XML con una sintassi sbagliata vengono generati degli errori che non vengono visualizzati nell'output (libxml_use_internal_errors(true)) e però i relativi messaggi di errore vengono recuperati tramite libxml_get_errors().
Per concludere vediamo come modificare, aggiungere ed eliminare un elemento da un documento XML, ad esempio per modificare l'elemento price visto in precedenza si usa la sintassi
Codice PHP
<?php
//-------
$catalog->cd->price = "12.50";
in particolare se vogliamo modificare l'attributo currency dell'elemento price si usa la sintassi
Codice PHP
<?php
//------
$catalog->cd->price->attributes()['currency']="EUR";
poichè come visto gli attributi di un elemento sono memorizzati in un array associativo, e quindi per modificare un dato attributo è possibile usare il nome.
Per aggiungere un elemento a un documento XML si usa la funzione addChild(), ad esempio se vogliamo aggiungere l'elemento copiessold all'elemento cd si usa la sintassi
Codice PHP
<?php
//------
$catalog->cd->addChild('copiessold', '10 milion');
Per eliminare un elemento si usa la funzione unset, ad esempio per eliminare l'elemento copiessold creato in precedenza si usa la sintassi
Codice PHP
<?php
//------
unset($catalog->cd->copiessold);