Page 1 sur 2

Récuperer des infos sur un XML

Posté : 26 janv. 2017, 22:01
par yoann38
Salut tout le monde, voilà j'ai un fichier XML dont j'essai de récupérer les infos ... je bloque sur 1 champ à récupérer, le champ
StartDate

J'essai donc de récupérer le contenu de <value>....</value> de

Voici un exemple du xml pour mieux comprendre :
<products>
<product>
<TDProductId>2400714759</TDProductId>
<name>SEDRATA, HISTOIRE ET ARCHEOLOGIE</name>

<TDCategories>
<TDCategory>
<id>2</id>
<name>Un-categorised</name>
<merchantName>61M</merchantName>
</TDCategory>
</TDCategories>
<fields>
<field>
<name>Max price</name>
<value>6.50</value>
</field>
<field>
<name>nameLocation</name>
<value>AUDITORIUM DU LOUVRE</value>
</field>
<field>
<name>StartDate</name>
<value>27/01/2017</value>
</field>

<field>
<name>subCategory</name>
<value>D'UN CARREFOUR DU SAHARA MEDIEVAL</value>
</field>
</fields>
</product>
</products>

Je lis mon fichier ainsi :
<?php
    include("include/conect.php");
    include("include/variables.php");
      
	$flux = simplexml_load_file('pf_2920986_276413_25088.xml'); // Source du flux.xml
	set_time_limit(0);

    // On entre les entrees en bdd 
	function multiexplode ($delimiters,$string) {
   
    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
	}                
    foreach ($flux->product as $item) {
		

    // Récupération des données en fonction du tagname du XML
	$number = addslashes($item->TDProductId);
    $titre = addslashes($item->name);
    $price = $item->price;
    $url_fnac = $item->productUrl;
	$date_d= $item->StartDate;
    $date_f = $item->endDate;
    $street = addslashes($item->terms);
    $photo = $item->imageUrl;
	$type_loisir = $item->description;
    $genre = $item->merchantCategoryPath;
	$manufacturer = addslashes($item->nameLocation);
	
	echo '<h3>Annonce</h3>';
	echo $number.'<br>';
	echo $titre.'<br>';
	echo $price.'<br>';
	echo $url_fnac.'<br>';
	echo $date_d.'<br>'; // ne marche pas
	
	echo '<br>';

	}

?>
Merci pour vos lumières

Re: Récuperer des infos sur un XML

Posté : 29 janv. 2017, 13:44
par Naroth
D'après le XML que tu nous as envoyé le champ StartDate est accessible via :
$flux->product->fields->field[2]->value
PS : je te déconseille le "set_time_limit(0);"

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 05:31
par yoann38
Alors voilà j'ai essayé mais je dois mal m'y prendre je re expose mon problème au passage:

XML:
<product>
        <name>ABBAYE DU THORONET</name>
        <price>9.60</price>
               <fields>
                <codsal>THORO</codsal>
                 <cptsal>83340</cptsal>
                 <dafman>31/12/2017</dafman>
                 <geoloc>2~5~6.297179~43.38233</geoloc>
              </fields>
</product>
Je souhaite récupérer par exemple le contenu de <dafman> ... </dafman>

Pour l'instant j'ai:
// On entre les entrees en bdd 
	function multiexplode ($delimiters,$string) {
   
    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
	}                
    foreach ($flux->product as $item) {
		

    // Récupération des données en fonction du tagname du XML
	$number = addslashes($item->TDProductId);
    $titre = addslashes($item->name);
    $price = $item->price;
    $url_fnac = $item->productUrl;
	$postcode = $item->cptsal;
	$adresse = $item->adrsal;
	$date_debut_sortie = $item->dadman;
    $date_fin_sortie = $item->dafman;
	$geoloc = $item->geoloc;
    $photo = $item->grvisu;
	$manufacturer = addslashes($item->nomsal);
    $genre = $item->merchantCategoryPath;

	 
	echo $number .'<br>'; 
	echo $titre .'<br>';
	echo $price .'<br>';
	echo $url_fnac .'<br>';
	
	// et la j'essai de récupérer le contenu de dafman par exemple
// ..... Suite du code
Un grand merci à vous ;)

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 16:49
par Naroth
Bonjour,

Si on prend ton xml d'exemple tu peux récupérer "dafman" de cette façon

[XML]$flux = simplexml_load_string('
<product>
<name>ABBAYE DU THORONET</name>
<price>9.60</price>
<fields>
<codsal>THORO</codsal>
<cptsal>83340</cptsal>
<dafman>31/12/2017</dafman>
<geoloc>2~5~6.297179~43.38233</geoloc>
</fields>
</product>'); // Source du flux.xml

echo "dafman : ".$flux->fields->dafman;[/php]

Je pense que dans ton xml tu as plusieurs "product" non ?

Avec ton premier XML
<products>
		<product>
				<TDProductId>2400714759</TDProductId>
				<name>SEDRATA, HISTOIRE ET ARCHEOLOGIE</name>

				<TDCategories>
						<TDCategory>
								<id>2</id>
								<name>Un-categorised</name>
								<merchantName>61M</merchantName>
						</TDCategory>
				</TDCategories>
				<fields>
						<field>
								<name>Max price</name>
								<value>6.50</value>
						</field>
						<field>
								<name>nameLocation</name>
								<value>AUDITORIUM DU LOUVRE</value>
						</field>
						<field>
								<name>StartDate</name>
								<value>27/01/2017</value>
						</field>
						<field>
								<name>subCategory</name>
								<value>D'UN CARREFOUR DU SAHARA MEDIEVAL</value>
						</field>
				</fields>
		</product>
</products>
Tu peux essayer ceci
J'ai volontairement commenté les champs qui n'apparaissent pas dans le bout de xml que tu nous as donné
foreach($flux->product as $item)
	{
		
		$number = addslashes($item->TDProductId);
		$titre = addslashes($item->name);
		$price = $item->fields->field[0]->value;
		$manufacturer = addslashes($item->fields->field[1]->value);
		$date_d= $item->fields->field[2]->value;

		// $url_fnac = $item->productUrl;
		// $date_f = $item->endDate;
		// $street = addslashes($item->terms);
		// $photo = $item->imageUrl;
		// $type_loisir = $item->description;
		// $genre = $item->merchantCategoryPath;

	}
	
	echo "$number<br>";
	echo "$titre<br>";
	echo "$price<br>";
	echo "$date_d<br>";
	echo "$manufacturer<br>"
Résultat

Code : Tout sélectionner

2400714759 SEDRATA, HISTOIRE ET ARCHEOLOGIE 6.50 27/01/2017 AUDITORIUM DU LOUVRE
Le xml est un arbre et il faut le parcourir de haut en bas
Pour accéder à la date de début tu es obligé d'accéder à la sous-branche "fields" puis la sous-sous-branche"field" pour enfin choisir la branche qui t'intéresse

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 17:34
par yoann38
Merci pour tes explications ;)

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 21:41
par yoann38
Alors c'est bon pour mon soucis mais j'en profite pour poser une question toujours sur le XML.
Dans mon xml je recupére la date mais souhaite pouvoir la transformer pour mysql

Actuellement la date est :
$date_debut = $item->dadman;
Nous donne 31/12/2017

J'ai donc essayé :
//conversion de la date debut du format fr(jj:mm:aaaa hh:mm:ss) en format us(aaaa-mm-jj hh:mm:ss)
	 $date_debut = date_create_from_format('d/m/Y',$date_debut);
	$date_debut = date_format($date_debut, 'Y-m-d');

Mais problème format retourne par ma page ...

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 21:56
par Naroth
Visiblement PHP n'est pas très à l'aise avec le format "d/m/Y" il faut donc le convertir brutalement dans un truc supporté
$date_debut = '31/12/2017';
$date_debut = str_replace('/', '-', $date_debut);
echo date('Y-m-d', strtotime($date_debut));

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 22:00
par yoann38
Franchement au top.
Encore pas mal de chose à apprendre.
Merci beaucoup

Re: [RESOLU] Récuperer des infos sur un XML

Posté : 01 févr. 2017, 22:02
par Naroth
Sinon en gardant les changements de format tu peux faire ceci :
$date_debut = '31/12/2017';
$date_debut = date_create_from_format("d/m/Y", $date_debut);
echo date('Y-m-d H:i:s',strtotime($date_debut->format('Y-m-d')));

Re: [RESOLU] Récuperer des infos sur un XML

Posté : 01 févr. 2017, 23:19
par yoann38
Bon j'ai tout finis sauf que le champ date ne s'insere pas car si je fait un echo de date_debut_sortie ( il n y a rien je ne sais pas pourquoi et pareil pour postcode )
// On entre les entrees en bdd 
	function multiexplode ($delimiters,$string) {
   
    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
	}                
    foreach ($flux->product as $item) {
		

    // Récupération des données en fonction du tagname du XML
	$number = addslashes($item->TDProductId);
    $titre = addslashes($item->name);
    $price = $item->price;
    $url_fnac = $item->productUrl;
	$postcode = $item->cptsal;
	$street = $item->adrsal; //
	$date_debut_sortie = $item->dadman; //
    $date_fin_sortie = $item->dafman; //
    $photo = $item->grvisu;
	$manufacturer = $item->nomsal;
    $genre = $item->description;
	$city = $item->fields->villesal;

	// on parcourt le tag longDescription du XML
	$genre = addslashes($item->description);
	$decoupe = multiexplode(array(";"),$genre);
	
	echo $postcode;
	
	// Début événement
	$style_one = $decoupe[0];
	
	// Département
	$departement = substr($item->fields->cptsal, 0, 2);  // retourne "abcde"

	// Région
	$region = regionIdByDepartement($departement);
     
    // Attribution de la valeur id 1010 pour la fnac
    $id_simply_user = '999';
     
    // On valide la sortie par default
    $valide = '1';
	
	$url_convertis = simplification($titre);

	// Si il n y a pas de salle
	$salle = !empty($manufacturer) ? ucfirst(strtolower($manufacturer)) : NULL;
	

	foreach (explode(' ; ', $item->description) as $subtype) {
	$id_type_loisirs = $type[$subtype];
	}  

	
    // incrémenter le nombre de ce type
    if(isset($tab_nbre[$id_type_loisirs]))
    {
		
       // vérifier de ne pas dépasser le nombre de textes que tu a défini
       if ($tab_nbre[$id_type_loisirs] >= count($tab_sortie[$id_type_loisirs]))
       {
          $tab_nbre[$id_type_loisirs] = 0;
        }else{
          $tab_nbre[$id_type_loisirs]++;
        }
    }else{
       $tab_nbre[$id_type_loisirs] = 0;
    }
  
	 if( isset($tab_sortie[$id_type_loisirs]) && isset($tab_nbre[$id_type_loisirs]) && isset($tab_sortie[$id_type_loisirs][$tab_nbre[$id_type_loisirs]])) {
	$description = $tab_sortie[$id_type_loisirs][$tab_nbre[$id_type_loisirs]];
	}else {
	// log d'une erreur que tu retrouveras facilement
	continue; // passe à l'itération suivante ça sert à rien d'aller plus loin cette ligne est en errreur. 
	}
	// Le tableau
    $tab_sortie = [];
	

        // Requete pour calculer le nombre d'annonces en cours de validité
        $sql = "SELECT id_loisirs FROM loisirs WHERE number = '".$number."'";
        $req = $bdd->query($sql);
        $nbResult = $req->rowCount();
             
        //Entrée déjà existante
        if ($nbResult > 0) {  
        echo '"' . $number. '" existe déjà en ' . $nbResult . ' exemplaire(s)';
        } else { //  libre
             
               
   // Insertion
        $req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,url_rewrite,price,photo,url_fnac,date_debut_sortie,date_fin_sortie,description,street,codepostal,city,id_region,id_departements,id_type_loisirs,number,manufacturer,valide) VALUES ('$id_simply_user','$titre','$url_convertis','$price','$photo','$url_fnac','$date_debut_sortie', '$date_fin_sortie', '$description','$street','$codepostal','$city','$region','$departement','$id_type_loisirs','$number','$manufacturer','$valide')");
        $req->execute(array(
             
                      'id_simply_user'=>$id_simply_user,
                      'titre'=>$titre,
                      'url_rewrite'=>$url_convertis,
                      'price'=>$price,
                      'photo'=>$photo,
                      'url_fnac' => $url_fnac,
                      'date_debut_sortie' => $date_debut_sortie,
                      'date_fin_sortie' => $date_fin_sortie,
                      'description' => $description,
                      'street' => $street,
                      'codepostal'=>$codepostal,
                      'city'=>$city,
                      'id_region'=>$region,
                      'id_departements'=>$departement,
                      'id_type_loisirs'=>$id_type_loisirs,
                      'number'=>$number,
                      'manufacturer'=>$manufacturer,
                      'valide'=>$valide
                      )) or die('Problème lors de l\'insertion');
            }
			
        }

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 23:27
par Naroth
Hum... je sais pas si c'est lié, mais la syntaxe PDO pour une requête préparé est la suivante :
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories FROM fruit WHERE calories < :calories AND couleur = :couleur');
$sth->execute(array(':calories' => $calories, ':couleur' => $couleur));
les ":" à la place des "$" dans la requête

Source : http://php.net/manual/fr/pdostatement.execute.php

Re: Récuperer des infos sur un XML

Posté : 01 févr. 2017, 23:34
par yoann38
C'est bon j'ai trouvé c'était mon xml merci encore pour ta disponibilité ;)

Re: [RESOLU] Récuperer des infos sur un XML

Posté : 01 févr. 2017, 23:56
par yoann38
Bon il ne me reste que ce soucis de date pour finir.

Récup du fichier xml contenant la date:
$date_debut_sortie = $item->fields->dadman; //
// Formatage date
	echo $date_debut_sortie; // Exemple : 11/04/2016
	
	$date_debut_sortie = str_replace('/', '-', $date_debut_sortie);
	$date_debut_sortie = date_create_from_format("d/m/Y", $date_debut_sortie);
	echo date('Y-m-d H:i:s',strtotime($date_debut_sortie->format('Y-m-d')));
Voila le message d'erreur actuellement :
Call to a member function format() on a non-object in C:\wamp\www\azerty\integration.php on line 130

Re: Récuperer des infos sur un XML

Posté : 02 févr. 2017, 00:21
par Naroth
Tu as mélangé mes deux propositions ^^
// Formatage date
  echo $date_debut_sortie; // Exemple : 11/04/2016
  
  $date_debut_sortie = str_replace('/', '-', $date_debut_sortie); //Le format de la date devient d-m-Y
  $date_debut_sortie = date_create_from_format("d/m/Y", $date_debut_sortie); //Ici tu lui dis que le format initial est d/m/Y (ce qui ne correspond pas à ton format
  echo date('Y-m-d H:i:s',strtotime($date_debut_sortie->format('Y-m-d')));
En résumé commente
$date_debut_sortie = str_replace('/', '-', $date_debut_sortie); //Le format de la date devient d-m-Y
et ça marche

Pour être plus clair
Sur une date du type 02/03/2017, php à du mal a déterminé si c'est le 2 Mars 2017 ou le 3 Février 2017
Le premier paramètre de la fonction date_create_from_format spécifie le format utilisé dans ta date (qui est en deuxième paramètre)
date_create_from_format("d/m/Y", "02/03/2017") // Retournera le 2 Mars 2017
date_create_from_format("m/d/Y", "02/03/2017")  // Retournera le 3 Février 2017
En espérant être clair


Tu peux essayer le bout de code suivant :
$date_debut_sortie = "02/03/2016";  

  $date_debut_sortie = date_create_from_format("m/d/Y", $date_debut_sortie); //Lui retourne 2 Février
//$date_debut_sortie = date_create_from_format("d/m/Y", $date_debut_sortie); // 2 Mars
  echo date('Y-F-d H:i:s',strtotime($date_debut_sortie->format('Y-m-d'))); //Ecris en toute lettre le nom du mois

Re: Récuperer des infos sur un XML

Posté : 02 févr. 2017, 08:08
par yoann38
Bon j'ai essayé donc :

et ca retourne la valeur : 2016-February-03 00:00:00

mais j'ai une erreur :
Catchable fatal error: Object of class DateTime could not be converted to string in C:\wamp\www\azerty\integration.php on line 273

Je vais continuer à cherche ;)