Analizzare l’XML significa essenzialmente la navigazione attraverso un documento in formato XML per la restituzione dei dati pertinenti. Un numero crescente di servizi web restituiscono i dati in formato JSON, ma un gran numero restituiscono ancora i dati in formato XML, quindi è necessario padroneggiare l’analisi dell’XML, se davvero si vuole servire dell’intera gamma di API disponibili.
Utilizzando l’estensione SimpleXML di PHP, che è stato introdotto nel PHP 5.0, lavorare con l’XML è molto facile. In questo post si mostra come fare.
languages.xml:
<?xml version="1.0" encoding="utf-8"?>
<languages>
<lang name="C">
<appeared>1972</appeared>
<creator>Dennis Ritchie</creator>
</lang>
<lang name="PHP">
<appeared>1995</appeared>
<creator>Rasmus Lerdorf</creator>
</lang>
<lang name="Java">
<appeared>1995</appeared>
<creator>James Gosling</creator>
</lang>
</languages>
Il primo passo è quello di caricare il codice XML utilizzando la funzione simplexml_load_file() o simplexml_load_string(). Come ci si potrebbe aspettare, la prima carica il file XML da un file e la successiva carica il codice XML da una stringa data.
<?php
$languages = simplexml_load_file("languages.xml");
?>
SimpleXMLElement. Nell’esempio precedente, l’oggetto viene memorizzato nella variabile $languages. È quindi possibile utilizzare var_dump() o print_r() per ottenere i dettagli dell’oggetto restituito, se volete.
SimpleXMLElement Object
(
[lang] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[name] => C
)
[appeared] => 1972
[creator] => Dennis Ritchie
)
[1] => SimpleXMLElement Object
(
[@attributes] => Array
(
[name] => PHP
)
[appeared] => 1995
[creator] => Rasmus Lerdorf
)
[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[name] => Java
)
[appeared] => 1995
[creator] => James Gosling
)
)
)
languages come radice che è avvolto tre elementi lang, motivo per cui il SimpleXMLElement ha lang come proprietà pubblica che sarebbe un array di tre SimpleXMLElements. Ciascun elemento dell’array corrisponde ad un elemento lang nel documento XML.
È possibile accedere alle proprietà dell’oggetto nel solito modo con l’operatore ->. Ad esempio, $languages->lang[0]] vi darà un oggetto SimpleXMLElement che corrisponde al primo elemento lang. Questo oggetto ha due proprietà pubbliche: appeared e creator.
<?php
$languages->lang[0]->appeared;
$languages->lang[0]->creator;
?>
foreach.
<?php
foreach ($languages->lang as $lang) {
printf(
">%s apparso nel %d ed è stato creato da %s.",
$lang["name"],
$lang->appeared,
$lang->creator
);
}
?>
lang per recuperare il nome della lingua. È possibile accedere a qualsiasi attributo di un elemento rappresentato come un oggetto SimpleXMLElement utilizzando la notazione di array come questo di sopra.languages.xml per rispecchiare l’utilizzo degli spazi dei nomi
<?xml version="1.0" encoding="utf-8"?>
<languages
xmlns:dc="http://purl.org/dc/elements/1.1/">
<lang name="C">
<appeared>1972</appeared>
<dc:creator>Dennis Ritchie</dc:creator>
</lang>
<lang name="PHP">
<appeared>1995</appeared>
<dc:creator>Rasmus Lerdorf</dc:creator>
</lang>
<lang name="Java">
<appeared>1995</appeared>
<dc:creator>James Gosling</dc:creator>
</lang>
</languages>
creator è posto sotto il namespace dc che punta a http://purl.org/dc/elements/1.1/. Se si tenta di stampare il creatore di una linguaggio usando la tecnica precedente, non funzionerà. Per leggere gli elementi namespace come questo è necessario utilizzare uno dei seguenti approcci.
Il primo approccio è quello di utilizzare l’URI dello spazio dei nomi direttamente nel codice quando si accede a elementi namespace.
Nell’esempio riportato di seguito viene illustrato come:
<?php
$dc = $languages->lang[1]- >children("http://purl.org/dc/elements/1.1/");
echo $dc->creator;
?>
children() prende uno spazio dei nomi e restituisce i figli dell’elemento preceduto. Accetta due argomenti: il primo è lo spazio dei nomi XML e il secondo è un valore booleano opzionale che per impostazione predefinita è su false. Se si passa true, lo spazio dei nomi sarà trattato come un prefisso piuttosto come l’URI del namespace attuale.
Il secondo approccio è quello di leggere l’URI dello spazio dei nomi dal documento e utilizzarlo durante l’accesso agli elementi del namespace. Questo è in realtà il modo più pulito per accedere agli elementi, perché non c’è bisogno di codificare l’URI.
<?php
$namespaces = $languages->getNamespaces(true);
$dc = $languages->lang[1]->children($namespaces["dc"]);
echo $dc->creator;
?>
getNamespaces() restituisce un array con i prefissi dello spazio dei nomi con il loro URI associato. Accetta un parametro opzionale il cui valore predefinito è false. Se lo si imposta true allora il metodo restituirà gli spazi dei nomi utilizzati in nodi principali e secondari. In caso contrario, non trova spazi dei nomi utilizzati solo nel nodo genitore.
Ora è possibile scorrere l’elenco delle linguaggi in questo modo:
<?php
$languages = simplexml_load_file("languages.xml");
$ns = $languages->getNamespaces(true);
foreach($languages->lang as $lang) {
$dc = $lang->children($ns["dc"]);
printf(
">%s apparso nel %d ed è stato creato da %s.",
$lang["name"],
$lang->appeared,
$dc->creator
);
}
?>
http://gdata.youtube.com/feeds/api/users//uploads
- Video URL
- Thumbnail
- Title
<?php
$channel = "channelName";
$url = "http://gdata.youtube.com/feeds/api/users/".$channel."/uploads";
$xml = file_get_contents($url);
$feed = simplexml_load_string($xml);
$ns=$feed->getNameSpaces(true);
?>
entity) ciascuno dei quali memorizza i dettagli di un video dal canale. Ma se ci interessa solo un’immagine in miniatura, URL del video e il titolo. I tre elementi sono figli del gruppo (group), che è un figlio dell’entrata (entry):
<entry>
<media:group>
<media:player url="video url"/>
<media:thumbnail url="video url" height="height" width="width"/>
<media:title type="plain">Title
</media:title>
</media:group>
</entry>
entry, e per ogni loop è possibile estrarre le informazioni pertinenti. Si noti che nel player il thumbnail e il title sono tutti sotto lo spazio dei nomi dei media. Quindi, abbiamo bisogno di procedere come nell’esempio precedente: ottenere gli spazi dei nomi del documento e utilizzare lo spazio dei nomi durante l’accesso agli elementi.
<?php
foreach ($feed->entry as $entry) {
$group=$entry->children($ns["media"]);
$group=$group->group;
$thumbnail_attrs=$group->thumbnail[1]->attributes();
$image=$thumbnail_attrs["url"];
$player=$group->player->attributes();
$link=$player["url"];
$title=$group->title;
printf('<a href="%s"><img src="%s" alt="%s"></a>',
$player, $image, $title);
}
?>

Ancora nessun commento