[spip-dev] Boucle DATA et fichier RDF

Bonjour à tous,

J'ai posé cette question sur la liste spip mais il aurait peut-être été plus judicieux que je la pose ici...

Je souhaite interroger à la volée la base http://data.ign.fr pour récupérer ces informations dans une page et les exploiter. Sur le principe des "big data" (fr.wikipedia.org/wiki/Big_data).

J'essaie d'utiliser les itérateurs de spip pour cela. Mais ma boucle data ne retourne rien. Erreur de syntaxe peut-être. Ou une option à définir pour lire un fichier rdf ?
La documentation sur les itérateurs sur http://spip.net est un peu succinte et l'exemple pour le xml ne fonctionne plus...

Voici l'url du fichier rdf : http://data.ign.fr/id/geofla/departement/04

et ma boucle (en test sur le code du département) :

<BOUCLE_xml(DATA) {source rdf, http://data.ign.fr/id/geofla/departement/04} {datapath rdf/rdf:Description/code-dept}>
    
  #VALEUR

  </BOUCLE_xml>

Merci de votre aide.

Amicalement,

Pierrick

* Pierrick / Free tapuscrivait, le 16/02/2013 13:15:

Bonjour à tous,

J'ai posé cette question sur la liste spip mais il aurait peut-être été
plus judicieux que je la pose ici...

Effectivement, question semblable posée ici-même en début de semaine :
http://thread.gmane.org/gmane.comp.web.spip.devel/63916

:wink:

Merci, Realet,

J'ai effectivement réussi à récupérer le fichier et à boucler dessus en utilisant la fonction proposée par Mathieu et Cedric sur Spip Contrib :
http://contrib.spip.net/Les-Iterateurs-pour-SPIP-2-1

Mais comment sélectionner les éléments qui m'intéressent ? Je ne comprends pas le fonctionnement de la balise #VALEUR. Quelqu'un peut-il me donner quelques éclaircissements ?

Voici le fichier tel que je le récupère :

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;

<rdf:Description rdf:about="http://data.ign.fr/id/geofla/departement/05&quot;&gt;
  <code-dept xmlns="http://data.ign.fr/id/geofla/&quot;&gt;05&lt;/code\-dept&gt;
  <nom-dept xmlns="http://data.ign.fr/id/geofla/&quot;&gt;HAUTES\-ALPES&lt;/nom\-dept&gt;
  <code-chf xmlns="http://data.ign.fr/id/geofla/&quot;&gt;061&lt;/code\-chf&gt;
  <nom-chf xmlns="http://data.ign.fr/id/geofla/&quot;&gt;GAP&lt;/nom\-chf&gt;
  <x-chf-lieu xmlns="http://data.ign.fr/id/geofla/&quot; rdf:datatype="http://www.w3.org/2001/XMLSchema#integer&quot;&gt;9443&lt;/x\-chf\-

  <y-chf-lieu xmlns="http://data.ign.fr/id/geofla/&quot; rdf:datatype="http://www.w3.org/2001/XMLSchema#integer&quot;&gt;63891&lt;/y\-chf\-

  <code-reg xmlns="http://data.ign.fr/id/geofla/&quot;&gt;93&lt;/code\-reg&gt;
  <nom-region xmlns="http://data.ign.fr/id/geofla/&quot;&gt;PROVENCE\-ALPES\-COTE D'AZUR</nom-region>
  <st-astext xmlns="http://data.ign.fr/id/geofla/&quot;&gt;MULTIPOLYGON\(((6.94833509140486 44.6548162991468,6.93993879268619 44.6521322882911,6.91526660587786 44.6597963885516,6.90760416222243 44.6563898933561,6.90147069003315 44.6471511628869,6.8822741287304 44.6313323278065,6.85873780871952 44.6279024700136,6.85235603687456 44.614866562648,6.8451085494829 44.6101798161868,6.8210039742599 44.6080600092218,6.80898705028046 44.6020037217087,6.79994193165067 44.6042531016748,6.79408865833075 ......

Ma boucle :

<B_f>
  <ul>
  <BOUCLE_f(DATA){source table, #VALEUR**}>
  <B_g>
  <li>
      <BOUCLE_g(BOUCLE_f)/>
  </li>
  </B_g><li>#VALEUR<//B_g></BOUCLE_f>
  </ul>
</B_f>

Comment sélectionner les éléments qui m'intéressent ? Par exemple "nom-dept" ou "st-astect" ?

Merci.

Pierrick

PS. Ci-dessous, ce que j'obtiens avec la boucle :

<ul>
  
  <li>rdf
  <li>
  <li>Array
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>description
  <li>
  
  <li>
      
  <ul>
  
  <li>http://data.ign.fr/id/geofla/departement/05
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>code-dept
  <li>05
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>nom-dept
  <li>HAUTES-ALPES
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>code-chf
  <li>061
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>nom-chf
  <li>GAP
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>x-chf-lieu
  <li>9443
  
  <li>
      
  <ul>
  
  <li>http://www.w3.org/2001/XMLSchema#integer
  </ul>
  
  </li>
  
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>y-chf-lieu
  <li>63891
  
  <li>
      
  <ul>
  
  <li>http://www.w3.org/2001/XMLSchema#integer
  </ul>
  
  </li>
  
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>code-reg
  <li>93
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>nom-region
  <li>PROVENCE-ALPES-COTE D'AZUR
  <li>Array
  </ul>
  
  </li>
  
  </ul>
  
  </li>
  
  <li>
      
  <ul>
  
  <li>
      
  <ul>
  
  <li>st-astext
  <li>MULTIPOLYGON(((6.94833509140486 44.6548162991468,6.93993879268619 44.6521322882911,6.91526660587786 44.6597963885516,6.90760416222243 44.6563898933561,6.90147069003315 44.6471511628869,6.8822741287304 44.6313323278065,6.85873780871952 44.6279024700136,6.85235603687456 44.614866562648,6.8451085494829 44.6101798161868,6.8210039742599 44.6080600092218,6.80898705028046 44.6020037217087,6.79994193165067 44.6042531016748,6.79408865833075 44.5947023463705,6.78023428630093 44.5931315807721,6.76921939661612 44.5860996276544,6.76914711891047 44.5757735124307,6.75580797379655 44.5712531830641,6.73855530870497 44.55....

Pour débuguer tu peux écrire [(#VALEUR|print_r{1})] tu verras alors la valeur de #VALEUR qui peut être une chaine de caractère ou un tableau.

BoOz

Merci, Booz,

Avec [(#VALEUR|print_r{1})] , j'arrive à voir le fichier, mais je n'arrive à rien. Je pense que je ne comprends pas la syntaxe à utiliser avec #VALEUR.
La seule chose que j'arrive à obtenir avec #VALEUR{name}, c'est "rdf". Doit-on suivre le DOM ?

Voici le fichier xml tel que je le lis avec [(#VALEUR|print_r{1})] (j'ai enlevé les valeurs de MULTIPOLYGON pour ne pas alourdir le mail). Comment, par exemple, extraire ces valeurs ?

- nom-region [text] => PROVENCE-ALPES-COTE D'AZUR
- st-astext [text] => MULTIPOLYGON(((6.94833509140486...

Merci de vos lumières.

Pierrick

Array ( [name] => rdf [text] => [attributes] => Array ( ) [children] => Array ( [rdf:description] => Array ( [0] => Array ( [name] => description [text] => [attributes] => Array ( [rdf:about] => http://data.ign.fr/id/geofla/departement/05 ) [children] => Array ( [code-dept] => Array ( [0] => Array ( [name] => code-dept [text] => 05 [attributes] => Array ( ) [children] => Array ( ) ) ) [nom-dept] => Array ( [0] => Array ( [name] => nom-dept [text] => HAUTES-ALPES [attributes] => Array ( ) [children] => Array ( ) ) ) [code-chf] => Array ( [0] => Array ( [name] => code-chf [text] => 061 [attributes] => Array ( ) [children] => Array ( ) ) ) [nom-chf] => Array ( [0] => Array ( [name] => nom-chf [text] => GAP [attributes] => Array ( ) [children] => Array ( ) ) ) [x-chf-lieu] => Array ( [0] => Array ( [name] => x-chf-lieu [text] => 9443 [attributes] => Array ( [rdf:datatype] => http://www.w3.org/2001/XMLSchema#integer ) [children] => Array ( ) ) ) [y-chf-lieu] => Array ( [0] => Array ( [name] => y-chf-lieu [text] => 63891 [attributes] => Array ( [rdf:datatype] => http://www.w3.org/2001/XMLSchema#integer ) [children] => Array ( ) ) ) [code-reg] => Array ( [0] => Array ( [name] => code-reg [text] => 93 [attributes] => Array ( ) [children] => Array ( ) ) ) [nom-region] => Array ( [0] => Array ( [name] => nom-region [text] => PROVENCE-ALPES-COTE D'AZUR [attributes] => Array ( ) [children] => Array ( ) ) ) [st-astext] => Array ( [0] => Array ( [name] => st-astext [text] => MULTIPOLYGON(((6.94833509140486 44.6548162991468,6.93993879268619 44.6521322882911,6.91526660587786 ... 44.6781091831208,6.95826822560989 44.6723449520695,6.95756598786434 44.6623554449285,6.94833509140486 44.6548162991468))) [attributes] => Array ( ) [children] => Array ( ) ) ) ) ) ) ) )

Comment, par exemple, récupérer

Salut,

Avec [(#VALEUR|print_r{1})] , j'arrive à voir le fichier, mais je n'arrive à
rien. Je pense que je ne comprends pas la syntaxe à utiliser avec #VALEUR.
La seule chose que j'arrive à obtenir avec #VALEUR{name}, c'est "rdf".
Doit-on suivre le DOM ?

avec un :
<pre>
[(#VALEUR|print_r{1})]
</pre>

Tu obtiendrais quelque chose de plus lisible.

#VALEUR est un array contenant des array. Le <pre> te permettra de
tabuler. Ensuite pour accéder aux contenus il suffit d'utiliser les
bonnes clés:

#VALEUR{clé_niveau_1/clé_niveau_2/.../clé_niveau_42}

ex.: #VALEUR{children/rdf:description/0/text/attributes/rdf:about}
devrait retourner un truc comme
http://data.ign.fr/id/geofla/departement/05 (si je ne me suis pas
gouré).

Bref, oui, en quelque sorte, il faut suivre le DOM.

Utilises :
<pre>[(#VALEUR|print_r{1})]</pre>

Déjà ce cera plus lisible.

Ensuite, tu peux utiliser #VALEUR{children/rdf:description} ...
ou #VALEUR{children/rdf:description/0/attributes/rdf:about} ...

Je viens de tester cela avec succès :

<BOUCLE_d(DATA)
   {source simplexml,http://data.ign.fr/id/geofla/departement/04}>
  <strong>Polygone :</strong>
  <em>#VALEUR{children/rdf:description/0/children/st-astext/0/text}</em>

  <hr />
  <pre>[(#VALEUR**|print_r{1})]</pre>
</BOUCLE_d>

Par contre, il faut absolument décommenter (faire exécuter) la ligne suivante dans le script xmlObjToArr(), sinon «rdf:» n'est pas vu :
# Cette fonction getDocNamespaces est tres gourmande sur de gros fichiers
$namespace = $obj->getDocNamespaces(true);

MM.

Oui et il y a également la balise #CLE qui donne la cle correspondante à #VALEUR sur chaque niveau.

Tu peux aussi décider de refaire une boucle imbriquée avec

Voici ce qu’on a pour cette clé : #CLE : <BOUCLE_2(DATA){source table, #VALEUR}> [(#VALEUR|print_r{1})]

BoOz

Hello,

C’est la fonction indiquée là (), bien mieux je trouve que la fonction xml native qui a été mise dans les itérateurs car elle permet de pécho les attributs des balises, les clés. Chaque tag crée un tableau de 4 entrées : - name (truc) - texte le texte entre texte - attributes la liste de - children la liste des … Par contre, elles ne fonctionnent du coup pas pareil, avec la source xml, tu attrapes #VALEUR{truc/0/enfant/0} alors qu’avec la source simpleXML tu attrapes #VALEUR{truc/0/children/enfant/0} mais tu peux attraper #VALEUR{truc/0/attributes/id} ce que tu ne peux pas avec l’autre… Donc, en gros dès que tu as des attributs à attraper, cette 2e fonction est mieux. Il faut qu’on trouve un moyen de la mettre dans le core, soit en l’ajoutant sous un 2e nom (comme simplexml ici), soit en cassant la compat de l’ancienne. MM.

Yop,

Merci à Booz, Eric, Mathieu et Beurt,

J'ai décommenté la ligne indiquée dans script xmlObjToArr() et suivi vos exemples. Ca marche nickel. J'obtiens ce que je voulais. Je peux continuer mon projet et je vous montrerai le résultat dans quelques jours.

Bien amicalement,

Pierrick