2012-04-11 6 views
5

Ich sammle einige Daten im XML-Format über eine API und möchte es in einer Objektliste deserialisieren. Ich benutze Symfony2 und finde JMSSerializerBundle, aber ich weiß nicht wirklich, wie man es benutzt.Deserialize XML zu Objekt mit Symfony2

Ich weiß, dass Sf2 Serialisierung/Deserialisierung Objekt zu/von Array erlaubt, aber ich suche nach etwas Spezifischerem. Zum Beispiel für diese Klasse:

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; 
    } 
} 

würde Ich mag die Serialisierung/Deserialisierung zu/von dieser Art von 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> 

ich in Sf2 zu integrieren wirklich verwenden/integrieren etwas will (etwas "smooth") und vermeiden Sie lieber hausgemachte XML-Parser.

Antwort

4

Aufgrund der Art von XML ist das genaue, was Sie wollen, nicht möglich. Sie würden immer etwas brauchen, um Objekt -> XML und XML -> Objekt zu übersetzen.

Mein Vorschlag an Sie wäre eine Klasse, die als Sammlung arbeitet und kümmert sich um Sie, hält die Liste der Objekte als Eigenschaft, die aus einer XML-Eingabe erstellt werden und erstellen XML-Ausgabe von vorhandenen Objekten.

Eine Alternative (wenn Sie es nicht wirklich als XML benötigen) wäre einfach die Objekte zu serialisieren und sie auf diese Weise zu speichern, oder ein Array (oder Sammlungsobjekt) zu durchsuchen, wenn Sie alle auf einmal wollen . Die plain serialize() und unserialize() Funktionen von PHP werden dort den Trick machen. Da es nur Daten sind, brauchen Sie nicht einmal die Methoden serialisieren und deserialisieren in Ihrer Klasse.

Update: Wenn es nur die XML in ein Objekt nehmen ist, simplexml dann schon hat Sie bedeckt: http://www.php.net/manual/en/function.simplexml-load-string.php

Der zweite Parameter ist Klassenname.

Quote: Sie können diesen optionalen Parameter verwenden, damit simplexml_load_string() ein Objekt der angegebenen Klasse zurückgibt. Diese Klasse sollte die SimpleXMLElement-Klasse erweitern.

Wenn nur dies Ihr Ziel ist, dann Simplexml tut es schon.

Update 2: Ich habe mehr in das Bündel gelesen. Es tut NICHT, was Sie wollen. Es nimmt ein Objekt und serialisiert es in XML/YAML und kehrt dann natürlich diesen Prozess aus diesen serialisierten Zuständen wieder um. Es kann keine zufällige XML-Datei aufnehmen und macht daraus ein perfektes Objekt für Sie.

+0

Danke für Ihre Antwort. – Mikolaj

+0

Gern geschehen. Sie können mir danken, indem Sie es upvotieren und es annehmen :) –

+0

Tatsächlich vermisse ich meinen Schuss :) Hier ist mein Kommentar: Danke für Ihre Antwort. Tatsächlich ist die angezeigte Klasse nur ein Beispiel und die 2 Funktionen sind einfache Versuche. Ich möchte nicht mit hausgemachten Funktionen zu/von Xml serialisieren/deserialisieren. Ich weiß, dass JMSSerializerBundle bieten kann, was ich will, aber es ist mir nicht gelungen, es richtig zu benutzen ... Ich suche vor allem nach einem Beispiel für JMSSB oder eine andere Art, es "automatisch" zu tun, etwas skalierbar mit/über Symfony2. – Mikolaj

Verwandte Themen