2012-04-11 5 views
5

Je collecte des données au format XML via une API et je souhaite les désérialiser dans une liste d'objets. J'utilise Symfony2 et je trouve JMSSerializerBundle mais je ne sais pas vraiment comment l'utiliser.Désérialise le xml en objet avec Symfony2

Je sais que Sf2 permet de sérialiser/désérialiser un objet de/vers un tableau, mais je cherche quelque chose de plus spécifique. Par exemple, pour cette classe:

class Screenshot 
{ 
    /** 
    * @var integer $id 
    */ 
    private $id; 

    /** 
    * @var string $url_screenshot 
    */ 
    private $url_screenshot; 


    public function __construct($id, $url_screenshot) { 
     $this->id = $id; 
     $this->url_screenshot = $url_screenshot; 
    } 


    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set url_screenshot 
    * 
    * @param string $urlScreenshot 
    */ 
    public function setUrlScreenshot($urlScreenshot) 
    { 
     $this->url_screenshot = $urlScreenshot; 
    } 

    /** 
    * Get url_screenshot 
    * 
    * @return string 
    */ 
    public function getUrlScreenshot() 
    { 
     return $this->url_screenshot; 
    } 

    /** 
    * Serializes the Screenshot object. 
    * 
    * @return string 
    */ 
    public function serialize() 
    { 
     return serialize(array(
      $this->id, 
      $this->url_screenshot 
     )); 
    } 

    /** 
    * Unserializes the Screenshot object. 
    * 
    * @param string $serialized 
    */ 
    public function unserialize($serialized) 
    { 
     list(
      $this->id, 
      $this->url_screenshot 
     ) = unserialize($serialized); 
    } 

    public function __toString() { 
     return "id: ".$this->id 
       ."screenshot: ".$this->url_screenshot; 
    } 
} 

Je voudrais sérialisation/désérialisation à/de ce genre de xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<screenshots> 
    <screenshot> 
     <id>1</id> 
     <url_screenshot>screenshot_url1</url_screenshot> 
    </screenshot> 
    <screenshot> 
     <id>2</id> 
     <url_screenshot>screenshot_url2</url_screenshot> 
    </screenshot> 
    <screenshot> 
     <id>3</id> 
     <url_screenshot>screenshot_url3</url_screenshot> 
    </screenshot> 
</screenshots> 

Je veux vraiment utiliser quelque chose intégré/intégrer dans Sf2 (quelque chose "smooth") et préfèrent éviter les parseurs xml faits maison.

Répondre

4

En raison de la nature de XML, la chose exacte que vous voulez, n'est pas possible. Vous aurez toujours besoin de quelque chose pour traduire l'objet -> xml et xml -> objet. Ma suggestion pour vous serait une classe qui fonctionne comme une collection et prend soin de vous pour vous, en maintenant la liste des objets en tant que propriété, qui peut être créée à partir d'une entrée xml et créer une sortie xml à partir d'objets existants. Une alternative (si vous n'avez plus vraiment besoin de l'avoir comme xml) serait simplement de sérialiser les objets et de les stocker de cette façon, ou d'un tableau (ou d'un objet de collection) si vous les voulez tous en même temps . Les fonctions plainize serialize() et unserialize() de PHP feront l'affaire ici. Comme il s'agit uniquement de données, vous n'avez même pas besoin des méthodes serialize et unserialize dans votre classe.

Mise à jour: Si elle est seulement prendre le XML dans un objet, puis SimpleXML déjà vous a couvert: http://www.php.net/manual/en/function.simplexml-load-string.php

Le second paramètre est le nom de la classe.

Quote: Vous pouvez utiliser ce paramètre facultatif afin que simplexml_load_string() renvoie un objet de la classe spécifiée. Cette classe devrait étendre la classe SimpleXMLElement.

Si seulement cela est votre objectif, simplexml le fait déjà.

Mise à jour 2: J'ai lu un peu plus dans le paquet. Cela ne fait PAS ce que vous voulez. Il prend un objet et le sérialise en XML/YAML, puis, bien sûr, inverse à nouveau ce processus à partir de ces états sérialisés. Il ne peut pas prendre un fichier XML aléatoire et le transformer en un objet parfait pour vous.

+0

Merci pour votre réponse. – Mikolaj

+0

Vous êtes les bienvenus. Vous pouvez me remercier en l'upvotant et en l'acceptant :) –

+0

En fait, mon coup me manque :) Voici mon commentaire: Merci pour votre réponse. En effet la classe affichée n'est qu'un exemple et les 2 fonctions sont des essais simples. Je ne veux pas sérialiser/désérialiser vers/depuis xml avec des fonctions maison. Je sais que JMSSerializerBundle peut fournir ce que je veux mais je n'ai pas réussi à l'utiliser correctement ... Je cherche surtout un exemple pour l'utilisation de JMSSB ou une autre façon de le faire "automatiquement", quelque chose d'évolutif avec/via Symfony2. – Mikolaj

Questions connexes