<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hello World: &#187; Xml</title>
	<atom:link href="http://razorblade.netsons.org/category/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://razorblade.netsons.org</link>
	<description>Programmazione web e oltre: php5, Zend Framework, jQuery, Actionscript 3.0, Sandy 3D Engine e altro</description>
	<lastBuildDate>Fri, 28 Aug 2009 18:23:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Generare sitemap coerente con le specifiche di Google per il proprio sito web con Php e SimpleXML</title>
		<link>http://razorblade.netsons.org/2009/04/18/generare-sitemap-coerente-con-le-specifiche-di-google-per-il-proprio-sito-web-con-php-e-simplexml/</link>
		<comments>http://razorblade.netsons.org/2009/04/18/generare-sitemap-coerente-con-le-specifiche-di-google-per-il-proprio-sito-web-con-php-e-simplexml/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 11:06:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Xml]]></category>
		<category><![CDATA[generatore sitemap]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[indicizzazione]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[SimpleXml]]></category>
		<category><![CDATA[sitemap]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=74</guid>
		<description><![CDATA[<h2>Rendiamo il nostro sito indicizzabile dai motori di ricerca</h2>

<p>Oggi vedremo come creare una sitemap in xml usando l'oggetto Php SimpleXML. Per chi non lo conoscesse SimpleXML è una classe built in del linguaggio Php dalla versione 5 e per chi invece leggerà queste righe perchè cercava quale utilità ha o che cos'è una sitemap, possiamo dire che è un file XML dove sono listate tutte le url del nostro sito, utile ai motori di ricerca come Google, Yahoo, MSN ecc.. al fine dell'indicizzazione.</p>

<p>Grazie a SimpleXML leggere e scrivere file XML con php è veramente uno scherzo, in quanto sono necessarie poche righe di codice per fare tutto ciò di cui abbiamo bisogno. In questo tutorial costruiremo da zero una classe, che chiameremo Sitemap, che ci permetterà di fare tutto quello di cui abbiamo bisogno in maniera ordinata e semplice.<a href="http://razorblade.netsons.org/2009/04/18/generare-sitemap-coerente-con-le-specifiche-di-google-per-il-proprio-sito-web-con-php-e-simplexml">[...] Continua</a></p>


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Rendiamo il nostro sito indicizzabile dai motori di ricerca</h2>
<p>Oggi vedremo come creare una sitemap in xml usando l&#8217;oggetto Php SimpleXML. Per chi non lo conoscesse SimpleXML è una classe built in del linguaggio Php dalla versione 5 e per chi invece leggerà queste righe perchè cercava quale utilità ha o che cos&#8217;è una sitemap, possiamo dire che è un file XML dove sono listate tutte le url del nostro sito, utile ai motori di ricerca come Google, Yahoo, MSN ecc.. al fine dell&#8217;indicizzazione.</p>
<p>Grazie a SimpleXML leggere e scrivere file XML con php è veramente uno scherzo, in quanto sono necessarie poche righe di codice per fare tutto ciò di cui abbiamo bisogno. In questo tutorial costruiremo da zero una classe, che chiameremo Sitemap, che ci permetterà di fare tutto quello di cui abbiamo bisogno in maniera ordinata e semplice.</p>
<h2>Il protocollo di Google</h2>
<p>Visitando <a href="http://www.google.it/support/webmasters/bin/answer.py?answer=34657&#038;topic=13452">questa pagina</a> possiamo vedere come deve essere costruito il file xml per rispettare il protocollo di google, qui di seguito brevemente riassunto</p>
<p><b>Sitemap.php</b></p>
<pre name='code' class="php">

// Il file deve iniziare con questa linea
&lt;?xml version="1.0" encoding="UTF-8"?&gt;

// Deve contenere il tag urlset, che conterra al suo interno le varie url
&lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;

// Un esempio di url, loc è richiesto, il resto è opzionale
&lt;url&gt;
    &lt;loc&gt;http://www.example.com/&lt;/loc&gt;
    &lt;lastmod&gt;2005-01-01&lt;/lastmod&gt;
    &lt;changefreq&gt;monthly&lt;/changefreq&gt;
    &lt;priority&gt;0.8&lt;/priority&gt;
&lt;/url&gt; 

// Chiusura del tag urlset
&lt;/urlset&gt;
</pre>
<h2>Il listato della classe Sitemap.php</h2>
<pre name='code' class="php">
  class Sitemap
  {
    private $xml;
    private $sitemap;

    public function __construct(){
      $this->sitemap = 'percorso_fisico_alla_sitemap/sitemap.xml';
      $this->xml = $this->read($this->sitemap);
    }

    function read($file){
      if (file_exists($file)){
        try{
          return simplexml_load_file($file);
        }catch (Exception $e){
          throw new Exception("Errore nel caricamento del file");
        }
      }else{
        throw new Exception("File xml inesistente");
      }
    }

    function add($data){
      try{
        $node = $this->xml->addChild("url");
        $node->addChild("loc", $data['loc']);
        $node->addChild("lastmod", $this->datetime(isset($data['date']) &#038;&#038; !empty($data['date']) &#038;&#038; trim($data['date']) != '' ? $data['date'] : NULL));
        $node->addChild("changefreq", $data['changefreq']);
        $node->addChild("priority", $data['priority']);
      }catch(Exception $e){
        throw new Exception("Errore in add... i dati erano un array?");
      }
    }

    function get($couple){
      foreach($this->xml->url as $node){
        if ($node->$couple['node'] == $couple['value']){
          return $node;
        }
      }
      return NULL;
    }

    function edit($couple, $data){
      $node = $this->get($couple);
      $node->loc = $data['loc'];
      $node->lastmod = $this->datetime(isset($data['date']) &#038;&#038; !empty($data['date']) ? $data['date'] : NULL);
      $node->changefreq = $data['changefreq'];
      $node->priority = $data['priority'];
    }

    function timestamp($data){
      try{
        $data = explode(" ", $data);
        list($y, $m, $d) = explode("-", trim($data[0]));
        list($h, $mi, $sc) = explode(":", trim($data[1]));
        return mktime($h,$mi,$sc,$d,$m,$y);
      }catch(error $e){
        throw new Exception("Errore in timestamp");
      }
    }

    function datetime($date = NULL){
      try{
        $mktime = $date === NULL &#038;&#038; empty($date) ? mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")) : $this->timestamp($date);
        //return date(DATE_ATOM,$mktime);
        $offset = date("O",$mktime);
        return date("Y-m-d\TH:i:s",$mktime).substr($offset,0,3).":".substr($offset,-2);
      }catch(Exception $e){
        throw new Exception("Errore in datetime");
      }
    }

    function save(){
      //file_put_contents($this->sitemap, $this->xml->asXML());
      $this->xml->asXML($this->sitemap);
    }

    function delete($couple){
      $node = $this->get($couple);
      if ($node != NULL){
        unset($node[0][0]);
      }
    }

    function erase(){
      unset($this->xml->url);
    }
  }
  </pre>
<p>La classe possiede due proprietà private, $xml e $sitemap, che conterranno rispettivamente l&#8217;oggetto SimpleXML e la path fisica, completa di nome, della nostra sitemap. Alla sitemap dovranno essere impostati i permessi di scrittura. Vediamo qui di seguito una veloce spiegazione di ogni metodo.</p>
<p><b>Il Costruttore</b></p>
<pre name="code" class="php">
    public function __construct(){
      $this->sitemap = 'percorso_fisico_alla_sitemap/sitemap.xml';
      $this->xml = $this->read($this->sitemap);
    }
</pre>
<p>Il costruttore si occupa di attribuire i valori alle proprietà private, quindi istanzia SimpleXML tramite la chiamata al metodo read().</p>
<p><b>Il metodo read()</b></p>
<pre name="code" class="php">
    function read($file){
      if (file_exists($file)){
        try{
          return simplexml_load_file($file);
        }catch (Exception $e){
          throw new Exception("Errore nel caricamento del file");
        }
      }else{
        throw new Exception("File xml inesistente");
      }
    }
</pre>
<p>Questo metodo prova a creare l&#8217;oggetto SimpleXML tramire la chiamata alla funzione simplexml_load_file() a cui viene passato come argomento il file da leggere. Se la lettura ha successo ritorna l&#8217;oggetto SimpleXML.</p>
<p><b>Il metodo add()</b></p>
<pre name="code" class="php">
    function add($data){
      try{
        $node = $this->xml->addChild("url");
        $node->addChild("loc", $data['loc']);
        $node->addChild("lastmod", $this->datetime(isset($data['date']) &#038;&#038; !empty($data['date']) &#038;&#038; trim($data['date']) != '' ? $data['date'] : NULL));
        $node->addChild("changefreq", $data['changefreq']);
        $node->addChild("priority", $data['priority']);
      }catch(Exception $e){
        throw new Exception("Errore in add... i dati erano un array?");
      }
    }
</pre>
<p>Add() aggiunge un nodo <b>url</b> alla <b>urlset</b>. L&#8217;argomento da passare ad add() è un array che deve contenere necessariamente le chiavi &#8216;loc&#8217;, &#8216;changefreq&#8217; e &#8216;priority&#8217;. Può contenere anche la chiave &#8216;date&#8217; ( che diverrà il valore di &#8216;lastmod&#8217;), omettendolo il valore di &#8216;lastmod&#8217; equivarrà alla data attuale.</p>
<p><b>Il metodo get()</b></p>
<pre name="code" class="php">
    function get($couple){
      foreach($this->xml->url as $node){
        if ($node->$couple['node'] == $couple['value']){
          return $node;
        }
      }
      return NULL;
    }
</pre>
<p>Get() è un metodo utile alla ricerca di un nodo. Particolare ( credo ) il fatto di passare ad argomento un array che deve contenere la chiavi &#8216;node&#8217; e &#8216;value&#8217;: il valore di &#8216;node&#8217; sarà uno dei nodi contenuti in url ( quindi loc, lastmod, changefreq o priority ),  &#8216;value&#8217; sarà il valore da ricercare. Da sottolineare che il nodo ritornato è esclusivamente il primo trovato.</p>
<p><b>Il metodo edit()</b></p>
<pre name="code" class="php">
    function edit($couple, $data){
      $node = $this->get($couple);
      $node->loc = $data['loc'];
      $node->lastmod = $this->datetime(isset($data['date']) &#038;&#038; !empty($data['date']) ? $data['date'] : NULL);
      $node->changefreq = $data['changefreq'];
      $node->priority = $data['priority'];
    }
</pre>
<p>Edit() modifica i valori di un nodo esistente. Internamente utilizza il metodo get() per trovare il nodo da modificare. Gli argomenti da passare sono l&#8217;array per la ricerca e l&#8217;array con i dati che andranno a sostituirsi nel nodo trovato.</p>
<p><b>Il metodo timestamp()</b></p>
<pre name="code" class="php">
    function timestamp($data){
      try{
        $data = explode(" ", $data);
        list($y, $m, $d) = explode("-", trim($data[0]));
        list($h, $mi, $sc) = explode(":", trim($data[1]));
        return mktime($h,$mi,$sc,$d,$m,$y);
      }catch(error $e){
        throw new Exception("Errore in timestamp");
      }
    }
</pre>
<p>Timestamp è più che altro una utility, ritorna un timestamp da una data passata in formato dd/mm/yyyy hh/MM/ss. E&#8217; utilizzata in datetime()</p>
<p><b>Il metodo datetime()</b></p>
<pre name="code" class="php">
    function datetime($date = NULL){
      try{
        $mktime = $date === NULL &#038;&#038; empty($date) ? mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")) : $this->timestamp($date);
        //return date(DATE_ATOM,$mktime);
        $offset = date("O",$mktime);
        return date("Y-m-d\TH:i:s",$mktime).substr($offset,0,3).":".substr($offset,-2);
      }catch(Exception $e){
        throw new Exception("Errore in datetime");
      }
    }
</pre>
<p>Datetime() ritorna il corretto formato data da inserire nella sitemap rispetto al protocollo. Da notare che la riga commentata (return date(DATE_ATOM,$mktime);) è un metodo alternativo che ritorna lo stesso risultato delle 2 successive.</p>
<p><b>Il metodo save()</b></p>
<pre name="code" class="php">
    function save(){
      //file_put_contents($this->sitemap, $this->xml->asXML());
      $this->xml->asXML($this->sitemap);
    }
</pre>
<p>Save() salva le modifiche effettuate alla sitemap. La riga commentata è un metodo alternativo per salvare.</p>
<p><b>Il metodo delete()</b></p>
<pre name="code" class="php">
    function delete($couple){
      $node = $this->get($couple);
      if ($node != NULL){
        unset($node[0][0]);
      }
    }
</pre>
<p>Delete() elimina il nodo trovato. L&#8217;oggetto SimpleXML non possiede un metodo nativo per eliminare un nodo, a questo scopo utilizziamo la funzione unset() di php. Delete utilizza internamente get(), quindi per eliminare un nodo bisogna passare l&#8217;array utile alla sua ricerca.</p>
<p><b>Il metodo erase()</b></p>
<pre name="code" class="php">
    function erase(){
      unset($this->xml->url);
    }
</pre>
<p>Erase() elimina tutte le url della urlset. Utile per la reindicizzazione di tutte le url.</p>
<h2>Esempio di utilizzo</h2>
<p>Utilizare la classe è semplice, la si istanzia, si effettuano le varie modifiche, quindi si chiama il metodo save().</p>
<pre name="code" class="php">
  // Istanziare la classe
  $map = new Sitemap();

  // esempi di aggiunta nodi
  $map->add(array(
    'loc'=>'http://www.miosito.com/uno/',
    'changefreq'=>'monthly',
    'priority'=>'0.2'
  ));
  $map->add(array(
    'loc'=>'http://www.miosito.com/due/',
    'changefreq'=>'monthly',
    'priority'=>'0.2'
  ));

  // Esempio di eliminazione nodo
  $map->delete(array('node'=>'loc','value'=>'http://www.miosito.com/uno/'));

  // Salviamo la sitemap. Da chiamare dopo aver effettuato le modifiche
  $map->save();
</pre>
<p>Si conclude qui il tutorial, spero che sia utile a qualcuno, mi raccomando i commenti <img src='http://razorblade.netsons.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2009/04/18/generare-sitemap-coerente-con-le-specifiche-di-google-per-il-proprio-sito-web-con-php-e-simplexml/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
