Traitement des espaces de noms


PHP et XML

En travaillant avec XML de  différents services Web, vous aller rencontrer des éléments avec des noms d’espace.  

Regardons l’extrait de fichier de feed RSS de YouTub suivant :

Si vous affichez dans votre explorateur web un fichier RSS du feed de YouTub tel que :

http://gdata.youtube.com/feeds/api/standardfeeds/most_recent

vous constaterez la présence de plusieurs attributs de l’élément <feed> qui commence par xmlsn ce sont des espaces de noms (namespace) .

Dans le fichier précédemment cité, nous constatons la présence de 6 espaces de noms dans les attribut de la racine de noms comme suit :

 Les deux premiers sont des espace de noms pour le RSS en général.

Les autres sont comme vous pouvez le constater des espaces de noms :

xmlns:media='http://search.yahoo.com/mrss/' pour les éléments <media:keywords/>

xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' pour les éléments openSearch

xmlns:gd='http://schemas.google.com/g/2005' pour les élément gd

xmlns:yt='http://gdata.youtube.com/schemas/2007' pour les élément yt

Chaque  espace de noms pointe vers une URL. Si vous essayez d'obtenir les information du fichier XML ci-dessus à l'aide de notre technique précédente, il ne fonctionnera pas. 

Afin de lire les éléments avec namespaced comme ceci, vous devez utiliser l'une des approches suivantes.

La première approche consiste à utiliser l'URI de l'espace de noms dans votre code lorsque vous accédez à des éléments de l'espace de noms. L'exemple suivant montre comment :

Sélectionner le code

  <?php
  /*
  stocker l'URL du flux dans une varible $URLflux*/
     
  $URLflux ='http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed';
     
      /*
  lire et récupérer le flux dans un objet SimpleXML */ 
  $sxml = simplexml_load_file($URLflux);
  /*obtenir des nœuds dans les médias : en renseignant l'espace de noms aux
  médias */	       
  $media= $entry->children('http://search.yahoo.com/mrss/');
  //
  obtenir l'URL du lecteur vidéo     
  $attrs = $media->group->player->attributes();      
  $watch = $attrs['url'];
  ?>

 

La méthode children() prend un espace de noms et retourne les enfants de l'élément. Elle accepte deux arguments ; le premier est l'espace de noms XML et le second est un Boolean facultatif qui est par défaut false. Si vous transmettez la valeur true, l'espace de noms est considéré comme un préfixe plutôt que d’espace de noms réel URI.

La deuxième approche consiste à lire l'URI d'espace de noms dans le document et l'utiliser lorsque vous accédez aux éléments de l'espace de noms. C'est en fait un moyen plus propre d'accéder aux éléments parce que vous n'avez pas à coder en reprenant chaque fois l’URL de l’espace de noms.

Sélectionner le code

  <?php
  $namespaces= $sxml ->getNamespaces();
  $media= $entry->children($namespaces["media"]);
   ?>

 

La méthode getNamespaces() retourne un tableau des préfixes d'espace de noms avec leurs URIs associé. Elle accepte un paramètre optionnel qui est par défaut false. Si vous passez la valeur true, la méthode retournera les espaces de noms utilisés dans les nœuds parents et enfants. Dans le cas contraire, il trouve des espaces de noms utilisés dans le nœud parent seulement.

Maintenant, vous pouvez parcourir la liste des video en utilisant la boucle foreach comme vous avez appris dans le chapitre précédent.

Dans le chapitre suivant nous allons voir un exemple pratique sur comment Traiter et intégrer les données de YouTube dans votre application PHP avec l'extension SimpleXML PHP

Par carabde 30 mars 2015