Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2011, 10h05   #1
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Par défaut Importer des flux XML particuliers

Bonjour à tous,

Je suis entrain de créer un agrégateur de flux XML.
J'ai déjà importé environ une vingtaine de flux, mais il me reste un problème sur 3 flux. J'ai donc besoin de votre aide.

Flux 1 :
En fait mon script ne reconnait le flux N°1 ni comme du RSS, ni comme du XML !
Je pense que le flux est mal fait, mais je voudrai savoir s'il y a une possibilité de tout de même l'importer.
Le flux est organisé comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
    				<rss version="2.0" 
    						xmlns:media="http://search.yahoo.com/mrss/"
    						 xmlns:atom="http://www.w3.org/2005/Atom" 
    						 xmlns:georss="http://www.georss.org/georss" >
<title>SITE</title>
<channel>
  <item>
     <title>Titre</title>
<description>Description</description>
  </item>
  <item>
     <title>Titre2</title>
<description>Description2</description>
  </item>
Si je fais ce test :
Code :
 if($XmlArrays->feed_type=='RSS')
Le retour est FAUX

Et si je fais ce test :
Code :
if($XmlArray['channel']['item'])
Le restour est FAUX

Quel test dois-je faire pour avoir un retour VRAI et ensuite pouvoir récupérer les infos "title" et "description"

Flux n° 2 :
L'architecture de ce 2nd flux est la suivante
Code :
1
2
3
4
5
6
7
8
<Main>
  <Produit titre="titreA" description="desc1">
    <url>url</url>
  </produit>
  <Produit titre="titreB" description="desc2">
    <url>url2</url>
  </produit>
</main>
Je n'arrive pas à récupérer les informations qui sont à l'intérieur de la balise "Produit" : Les valeurs de "titre" et de "description". Par contre aucun problème pour récupérer l'URL avec la formule :
Code :
$absolute_url=$XmlArrayVal['main']['produit']['url'];
Comment faire ?
Y a t il une fonction particulière ?

Flux n°3 :
C'est encore plus bête, car je n'arrive même pas à récupérer ce flux !
A vrai dire je débute dans tout ce qui est programmation.
Ce flux est protégé par une clé pour le récupérer.
Voilà les infos que l'on m'a donné pour le récupérer :
Citation:
C'est une API de type REST, format XML, encodée en UTF-8.
La clé est à passer en clair dans un header HTTP "X-SITEApiKey"

Voici celle qui a été générée pour vous : aaaaa888bbbb

L'adresse de base que vous appellerez est :

http://www.lesite.fr/api/1.0.0/areas

Vous recevrez alors l'arbre des zones avec une URI pour chaque zone. A
noter qu'il n'y a des infos que sur les feuilles de l'arbre.

En appelant ensuite par exemple l'URI
http://www.lesite.fr/api/1.0.0/areas/paris, vous recevrez les infos
Merci pour vos retours.

Je suis désolé si mes explications ne sont pas exceptionnelles, mais je débute dans l'import de flux.
A votre dispo.


Pierrick

PS : J'ai fait un seul post pour ces 3 problèmes différents, si un modérateur souhaite que je scinde en 3 posts, qu'il me dise.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 12h10   #2
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Le problème sur le flux n°1 est résolu.
En fait, dans l'arborescence, je devais ajouter ['rss'] pour être au bon endroit dans le tableau.

Par contre je n'arrive pas à résoudre les problèmes sur les 2 autres flux.

Je compte donc sur votre aide.

Merci
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 13h54   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
pour produit c'est des attribut, donc utilise attributes


pour le REST il faut utiliser libxml_set_streams_context, pour ajouter une valeur en ton entete
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 17h38   #4
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Merci bien stealth35 pour ces infos.

Par contre je ne m'en sors pas.
Je me concentre pour le moment sur la fonction Attributes(), mais je ne m'en sors pas.

J'ai toujours mon flux qui a cette architecture là :
Code :
1
2
3
4
5
6
7
8
<Main>
  <Produit titre="titreA" description="desc1">
    <url>url</url>
  </produit>
  <Produit titre="titreB" description="desc2">
    <url>url2</url>
  </produit>
</main>
A priori, il faut transformer en string pour pouvoir utiliser la fonction attributes, mais je n'y arrive pas. Je n'ai que des tableaux, ou sinon c'est que je ne fais pas bien les choses.

Pour l'instant je fais :
Code :
1
2
3
4
5
6
7
$XmlArrays=$XmlArray['main'];
$xmlObject = new SimpleXMLElement($XmllArrays);
            foreach ($xmlObject->children() as $node)
            {
               $arr = $node->attributes();   // returns an array
               print ("title=".$arr['title']);     // get the value of this attribute
            }
Mais ça ne créé que des erreurs.

Merci pour vos conseils.

De mon coté, je regarde l'autre point.

Pierrick
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 18h08   #5
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
J'avance sur le 2ème point, mais je suis un peu bloqué.

Voilà où j'en suis:

J'ai créé ce fichier là pour importer le flux
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
$opts = array(
    'http' => array(
        'user_agent' => 'PHP libxml agent',
        'X-SITEApiKey' => 'aaaaa888bbbb',
    )
);
 
$context = stream_context_create($opts);
libxml_set_streams_context($context);
 
// lit un fichier via HTTP
$doc = DOMDocument::load('http://www.letsite.fr/api/1.0.0/areas');
echo $doc;
?>
et lorsque j'exécute le fichier, j'ai le résultat suivant :
Code :
1
2
3
Warning: DOMDocument::load(http://www.lesite.fr/api/1.0.0/areas) [domdocument.load]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in script_import.php on line 14
 
Warning: DOMDocument::load() [domdocument.load]: I/O warning : failed to load external entity "http://www.lesite.fr/api/1.0.0/areas" in script_import.php on line 14
Peut-être que je ne passe pas la clé au bon endroit ?

Merci d'avance pour vos conseils
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 18h26   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
c'est pas
Code php :
print ("title=".$arr['title']);

mais :
Code php :
print ("title=".$arr['titre']);


pour le point suivant, je sais pas trop déjà load ne dois pas est appelé statiquement, l'exemple est faux, utilise simplexml au lu ide dom document, et pas besoin non plus de mettre un user-agent
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h03   #7
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
En fait pour le premier point, le problème est plus "grave" que ça.

Voilà l'erreur que j'ai lorsque j’exécute :
Code :
Fatal error: Uncaught exception 'Exception' with message 'SimpleXMLElement::__construct() expects parameter 1 to be string, array given' in /rss-importer.php:2140 Stack trace: #0 /rss-importer.php(2140): SimpleXMLElement->__construct(Array) #1 /rss-importer.php(781): RSS_Import1->getArrayValues('xml', 11, Array, Array) #2 /rss-importer.php(439): RSS_Import1->GetXmlArray('http://flux.net...', '1') #3 [internal function]: RSS_Import1->dispatch() #4 /admin.php(196): call_user_func(Array) #5 {main} thrown in rss-importer.php on line 2140
Pour le 2ème point:
Comment faut-il utiliser simplexml ? Je ne comprends pas bien.

Merci de votre aide
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h15   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
utilise simplexml_load_file
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h25   #9
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Ah ok, c'est donc bien ce que j'avais fait, mais j'obtiens toujours le même message :

Code :
1
2
3
Warning: simplexml_load_file(http://www.letsite.fr/api/1.0.0/areas) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not /script_import.php on line 13
 
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://www.lesite.fr/api/1.0.0/areas" in /script_import.php on line 13
Je dirai qu'en fait il ne reconnait pas la clé, et que c'est pour cela que j'ai le "HTTP request failed". Non ?

Qu'en pensez-vous ?

Merci en tout cas pour votre aide, ça m'est très utile. J'aimerai vraiment pouvoir résoudre ces problèmes au plus vite !
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h36   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
c'est dans l'option header qu'il faut rajouter la clé

http://php.net/manual/fr/function.st...ext-create.php
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 19h59   #11
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Nickel la récupération du flux est donc récupéré.

La solution trouvée est donc comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$authenticationHeader = 'X-LesiteApiKey:aaaaa888bbbb';
$opts = array(
    'http' => array(
        'header'  => $authenticationHeader
    )
);
 
$context = stream_context_create($opts);
libxml_set_streams_context($context);
 
// lit un fichier via HTTP
$doc = simplexml_load_file('http://www.lesite.fr/api/1.0.0/areas/');
print_r($doc);
?>
Reste donc l'utilisation de attributes() qui reste un mystère pour moi.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 20h35   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par Pierrick81 Voir le message
Reste donc l'utilisation de attributes() qui reste un mystère pour moi.
c'est exactement pareil que la recuperation d'un array, tu t'es juste tromper en mettant title au lieu de titre
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 11h24   #13
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Bonjour,

J'ai corrigé le problème de titre et title, c'était une erreur de copier/coller.
J'ai désormais le code suivant :

Code :
1
2
3
4
5
6
7
$XmlArrays=$XmlArrays['main'];
            $xmlObject = new SimpleXMLElement($XmlArrays);
            foreach ($xmlObject->children() as $node)
            {
               $arr = $node->attributes();   // returns an array
               print ("titre=".$arr['titre']);     // get the value of this attribute
            }
Et cela me donne l'erreur "Fatale" suivante :
Code :
Fatal error: Uncaught exception 'Exception' with message 'SimpleXMLElement::__construct() expects parameter 1 to be string, array given' in /rss-feeder/rss-importer.php:2159 Stack trace: #0 /rss-feeder/rss-importer.php(2159): SimpleXMLElement->__construct(Array) #1 /rss-feeder/rss-importer.php(800): RSS_Import1->getArrayValues('xml', 11, Array, Array) #2 /rss-feeder/rss-importer.php(439): RSS_Import1->GetXmlArray('http://flux.net...', '1') #3 [internal function]: RSS_Import1->dispatch() #4 /admin.php(196): call_user_func(Array) #5 {main} thrown in /homez.131/rss-feeder/rss-importer.php on line 2159
Il y a semble-t-il un problème de format qui n'est pas supporté par SimpleXMLElement.
Merci d'avance.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 11h53   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
SimpleXMLElement attend une chaine XML,
a quoi correspond : $XmlArrays ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 12h30   #15
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Enfin, je m'en suis sorti !

J'ai repris un code trouvé sur le forum
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$nouveau_art = array();  // creation d'un tableau
 
$catalogue = simplexml_load_file('http://monflux'); // Je converti mon fichier xml en objet.
 
$i=0; //S'incrémente de 1 à chaque produit du flux.
$j=0;
foreach($catalogue->product as $product) // Je parse le flux.
 
{
   foreach($catalogue->product[$i]->attributes() as $a => $b)
     {
        ${$a} = (string) $b;  // la variable $id contient l'id et $number le number_produit
     }
 
   $i=$i+1; // Je passe au produit suivant.
 
   }
 
   $nouveau_art []= array ('title' => $title, 'description' => $highlights);  // Je mets les valeurs dans un tableau.
}  //  Fin du foreach parsage du flux.
Je mets ce code dans un fichier à part, puis je travaille avec le tableau $nouveau_art.

Je reviens par contre sur mon autre flux, que j'ai réussi à récupérer.
Par contre, je n'arrive pas à l'exploiter.
Lorsque j'affiche $doc, j'ai les infos suivantes :

Code :
SimpleXMLElement Object ( [@attributes] => Array ( [version] => 1.0.0 ) [products] => SimpleXMLElement Object ( [product] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [uri] => http://www.urlsite.fr [priority] => [canBeBought] => true ) [shortName] => auvergne [title] => Titre [pictures] => SimpleXMLElement Object ( [picture] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [uri] => http://www.urlimage.jpg ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [uri] => http://www.urlimg2) ) ) )...
Et je n'arrive pas récupérer les infos title ou uri à l'intérieur de ce fichier.
Faut-il faire une conversion ? et Comment ?
Merci pour votre aide... on touche au but !
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 14h20   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
t'as le même accès que pour un array
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 14h30   #17
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Justement j'ai essayé :

ou
mais ça ne renvoie rien.
C'est vide.

Comme s'il ne reconnaissait pas le format comme un array.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 14h48   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par Pierrick81 Voir le message
Justement j'ai essayé :

ou
mais ça ne renvoie rien.
C'est vide.

Comme s'il ne reconnaissait pas le format comme un array.
fais des var_dump pour afficher les valeurs
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 17h30   #19
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Voilà le résultat avec le var_dump($doc)

Code :
object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(1) { ["version"]=> string(5) "1.0.0" } ["products"]=> object(SimpleXMLElement)#2 (1) { ["product"]=> array(4) { [0]=> object(SimpleXMLElement)#3 (13) { ["@attributes"]=> array(3) { ["uri"]=> string(47) "http://www.lesite.fr" ["priority"]=> string(0) "" ["canBeBought"]=> string(4) "true" } ["shortName"]=> string(8) "auvergne" ["title"]=> string(190) "Titre detaille" ["pictures"]=> object(SimpleXMLElement)#7 (1) { ["picture"]=> array(2) { [0]=> object(SimpleXMLElement)#16 (1) { ["@attributes"]=> array(1) { ["uri"]=> string(71) "http://www.lesite.fr/img.jpg" } }
Si je fais var_dump($doc['products']), il affiche NULL

Impossible d'accéder à aucune donnée.

Merci de votre aide.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 18h53   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par Pierrick81 Voir le message
Voilà le résultat avec le var_dump($doc)

Code :
object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(1) { ["version"]=> string(5) "1.0.0" } ["products"]=> object(SimpleXMLElement)#2 (1) { ["product"]=> array(4) { [0]=> object(SimpleXMLElement)#3 (13) { ["@attributes"]=> array(3) { ["uri"]=> string(47) "http://www.lesite.fr" ["priority"]=> string(0) "" ["canBeBought"]=> string(4) "true" } ["shortName"]=> string(8) "auvergne" ["title"]=> string(190) "Titre detaille" ["pictures"]=> object(SimpleXMLElement)#7 (1) { ["picture"]=> array(2) { [0]=> object(SimpleXMLElement)#16 (1) { ["@attributes"]=> array(1) { ["uri"]=> string(71) "http://www.lesite.fr/img.jpg" } }
Si je fais var_dump($doc['products']), il affiche NULL

Impossible d'accéder à aucune donnée.

Merci de votre aide.
essaye avec $doc->products
montre ton XML de base
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h09.


 
 
 
 
Partenaires

Hébergement Web