Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 5] Lire du XML

Sujet résolu
12 juin 2021 à 14:51:48

Bonjour, j'ai une question, une boite partenaire souhaite intégrer ses offres sur un de mes sites, cependant ils ne m'ont donné qu'un fichier xml qui contient environs 5 000 offres. Mon application tourne en symfony 5 et j'ai déjà toutes mes tables et entités avec leurs propres champs qui sont un peu différents de ceux du fichier xml. Ma question s'est : Comment puis-je récupérer toutes ces offres et les envoyer dans ma table qui contient déjà pas mal d'offres entrées manuellement par beaucoup d'utilisateurs ? Merci d'avance !
  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 6:26:06

Bonjour,

Cela s'appelle une reprise de données ....

Il te faut faire un programme console en symfony qui va lire les éléments du fichier xml, va ensuite les traduire selon ton modèle Symfony avec les contrôles qui vont bien et tu sauvegardes.

Enfin c'est ce que je ferai.

A+

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 8:57:43

hello, comment je peux lire les éléments et les traduire selon mon modèle ? car mon entité ne correspond pas aux offres présentes dans le fichier xml
  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 10:30:26

Salut

"traduire selon" pourrait ici être remplacé entre autres par "faire correspondre à".
Techniquement, si tu sais lire un fichier XML, tu sais donc y récupérer les données. Si tu sais en plus quelle est la structure du fichier (donc ce que représente chaque nœud), tu devrais savoir quelle valeur doit être enregistrée quelle propriété parmi celles de tes entités.

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 10:43:35

Salut,

J'ai exactement le même cas que toi. Plusieurs partenaires m'envoient des flux XML que je dois insérer et faire correspondre à mes entités.

C'est assez simple à mettre en place, au passage tu peux utiliser XMLSimpleElement (qui est natif à PHP).

Par exemple, tu reçois des programmes immobiliers et pour chaque programme dans l'XML que tu vas parcourir, il y aura des champs qui correspondront plus ou moins à ce que tu cherches à insérer.

Exemple:

XML

<programmes>
   <programme>
      <nom>Le programme</nom>
      <code_postal>75000</code_postal>
   </programme>
</programmes>
$xml = simplexml_load_file('fichier.xml', 'SimpleXMLElement');

foreach ($xml->programmes->programme as $programmeXml) {

$programme = new Programme();
$programme->setNom($programmeXml->nom);
$programme->setCodePostal($programmeXml->code_postal);

...

}


Bon courage

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 11:19:06

FindL a écrit:

Salut,

J'ai exactement le même cas que toi. Plusieurs partenaires m'envoient des flux XML que je dois insérer et faire correspondre à mes entités.

C'est assez simple à mettre en place, au passage tu peux utiliser XMLSimpleElement (qui est natif à PHP).

Par exemple, tu reçois des programmes immobiliers et pour chaque programme dans l'XML que tu vas parcourir, il y aura des champs qui correspondront plus ou moins à ce que tu cherches à insérer.

Exemple:

XML

<programmes>
   <programme>
      <nom>Le programme</nom>
      <code_postal>75000</code_postal>
   </programme>
</programmes>
$xml = simplexml_load_file('fichier.xml', 'SimpleXMLElement');

foreach ($xml->programmes->programme as $programmeXml) {

$programme = new Programme();
$programme->setNom($programmeXml->nom);
$programme->setCodePostal($programmeXml->code_postal);

...

}


Bon courage

Salut, oui c’est exactement mon cas de situation je te remercie je vais essayer ça tout de suite ! 

Ymox : Enfaite j’ai du mal à parcourir le fichier et récupérer des éléments individuellement 

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 13:01:49

Pour poursuivre ma suggestion du début expliquée par les contributeurs, "traduire" ne veut pas dire remplacer un mot par un mot ... certaines expressions en français ne se traduisent pas par la concaténation des mots équivalents en anglais ... et bien te concernant c'est la même chose.

Donc il faut aussi regarder les règles de gestion, les règles de calcul, le nommage, etc

Ayant pas mal dirigé ce genre de problèmatique, c'est un vrai projet souvent négligé d'ailleurs au début de la définition d'un projet d'une application qui remplace une ancienne.

Pour info, sous Symfony, tu as aussi le composant DowCrawler : https://symfony.com/doc/current/components/dom_crawler.html

mais la méthode indiquée par FindL va bien aussi.

A+

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 13:48:16

Bon voilà ce que j'ai commencé pour l'instant, j'ai une erreur sur le "$xml" dans le foreach qui me dit évidemment qu'il attend un objet et récupère un string, sinon si je retire le 'SimpleXmlElement' j'ai une erreur :

Voici mon controller :

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class XmlController extends AbstractController
{
    /**
     * @Route("/openxml", name="xml")
     */
    public function index(): Response
    {
        $url = 'http://localhost/php/startpeople.xml';
        // $fileContents = file_get_contents($url);
        // $fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);
        // $fileContents = trim(str_replace('"', "'", $fileContents));
        // $simpleXml = simplexml_load_string($fileContents);
        // return new JsonResponse($simpleXml);

        $xml = simplexml_load_file($url, 'SimpleXMLElement');
 
        foreach ($xml->Offres_partenaires->Offre as $programmeXml) {
        
            // $programme = new Programme();
            // $programme->setNom($programmeXml->nom);
            // $programme->setCodePostal($programmeXml->code_postal);
            dd($programmeXml->Description);
        
        }
    }
}


Voilà à quoi ressemble mon xml :

-
Edité par AlexisMoren 13 juin 2021 à 15:35:49

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 17:05:02

C'est étrange que le fait d'enlever 'SimpleXMLElement" te génère une autre erreur car la valeur par défaut est justement 'SimpleXMLElement', donc l'enlever ou la renseigner ne changera rien.

En revanche, l'exemple que je t'ai fourni est mauvais car le premier parent (donc ton XML, Offres_partenaires) est omis lors de la lecture d'un XML (le premier node est 'normalement' toujours inutile). Donc, ton foreach devrait être le suivant :

foreach($xml->Offre as $offre)
{
...
}



-
Edité par FindL 13 juin 2021 à 17:06:19

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 17:32:41

OKay je pense que c'est bon jai réussi tout fonctionne merci beaucoup !!

-
Edité par AlexisMoren 13 juin 2021 à 19:54:01

  • Partager sur Facebook
  • Partager sur Twitter