使用Symfony2将xml反序列化为对象

时间:2022-10-25 16:38:35

I collect some data in xml format through an API and would like to deserialize it in an objects list. I'm using Symfony2 and find out JMSSerializerBundle but I do not really know how to use it.

我通过API收集xml格式的一些数据,并希望在对象列表中反序列化它。我正在使用Symfony2并找出JMSSerializerBundle但我真的不知道如何使用它。

I know that Sf2 allows to serialize/deserialize object to/from array, but I'm looking for something more specific. For example, for this class :

我知道Sf2允许将对象序列化/反序列化到数组,但我正在寻找更具体的东西。例如,对于这个类:

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

I would like serializing/deserializing to/from this kind of xml :

我想序列化/反序列化这种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>

I really want to use something integrated/to integrate in Sf2 (something "smooth") and prefer avoiding any homemade xml parsers.

我真的想要使用集成/集成在Sf2中的东西(“平滑”的东西)并且更喜欢避免使用任何自制的xml解析器。

1 个解决方案

#1


5  

Due to the nature of XML, the exact thing you want, is not possible. You would always need something to translate object -> xml and xml -> object.

由于XML的性质,您想要的确切的东西是不可能的。你总是需要一些东西来翻译对象 - > xml和xml - >对象。

My suggestion to you would be a class that works as collection and takes care of it for you, holding the list of objects as property, which can be created from an xml input and create xml output from existing objects.

我给你的建议是一个类作为集合并为你处理它,将对象列表保存为属性,可以从xml输入创建并从现有对象创建xml输出。

An alternativ (if you don't really need to have it as xml anymore) would be to simply serialize the objects and store them that way, or searialize an array (or collection object) if you want them all at once. The plain serialize() and unserialize() functions from PHP will do the trick there. Since it's data only, you don't even need the methods serialize and unserialize in your class.

一个替代方案(如果你真的不需要再将它作为xml)将简单地序列化对象并以那种方式存储它们,或者如果你想要一次性化它们,则将数组(或集合对象)分类。来自PHP的普通serialize()和unserialize()函数将在那里完成。由于它只是数据,因此您甚至不需要在类中进行序列化和反序列化的方法。

Update: If it's only take the XML into an object, then simplexml already has you covered: http://www.php.net/manual/en/function.simplexml-load-string.php

更新:如果它只将XML作为一个对象,那么simplexml已经涵盖了你:http://www.php.net/manual/en/function.simplexml-load-string.php

The second parameter is class name.

第二个参数是类名。

Quote: You may use this optional parameter so that simplexml_load_string() will return an object of the specified class. That class should extend the SimpleXMLElement class.

Quote:您可以使用此可选参数,以便simplexml_load_string()将返回指定类的对象。该类应该扩展SimpleXMLElement类。

If only this is your goal, then simplexml does it already.

如果这只是你的目标,那么simplexml已经完成了。

Update 2: I've read some more into the bundle. It does NOT do what you want. It takes an object and the serializes it into XML/YAML, and then of course reverses that process again from those serialized states. It cannot take some random XML file and turn that into a perfect object for you.

更新2:我已经阅读了更多内容。它没有做你想要的。它接受一个对象并将其序列化为XML / YAML,然后当然从那些序列化状态再次反转该过程。它无法获取一些随机的XML文件,并将其转换为完美的对象。

#1


5  

Due to the nature of XML, the exact thing you want, is not possible. You would always need something to translate object -> xml and xml -> object.

由于XML的性质,您想要的确切的东西是不可能的。你总是需要一些东西来翻译对象 - > xml和xml - >对象。

My suggestion to you would be a class that works as collection and takes care of it for you, holding the list of objects as property, which can be created from an xml input and create xml output from existing objects.

我给你的建议是一个类作为集合并为你处理它,将对象列表保存为属性,可以从xml输入创建并从现有对象创建xml输出。

An alternativ (if you don't really need to have it as xml anymore) would be to simply serialize the objects and store them that way, or searialize an array (or collection object) if you want them all at once. The plain serialize() and unserialize() functions from PHP will do the trick there. Since it's data only, you don't even need the methods serialize and unserialize in your class.

一个替代方案(如果你真的不需要再将它作为xml)将简单地序列化对象并以那种方式存储它们,或者如果你想要一次性化它们,则将数组(或集合对象)分类。来自PHP的普通serialize()和unserialize()函数将在那里完成。由于它只是数据,因此您甚至不需要在类中进行序列化和反序列化的方法。

Update: If it's only take the XML into an object, then simplexml already has you covered: http://www.php.net/manual/en/function.simplexml-load-string.php

更新:如果它只将XML作为一个对象,那么simplexml已经涵盖了你:http://www.php.net/manual/en/function.simplexml-load-string.php

The second parameter is class name.

第二个参数是类名。

Quote: You may use this optional parameter so that simplexml_load_string() will return an object of the specified class. That class should extend the SimpleXMLElement class.

Quote:您可以使用此可选参数,以便simplexml_load_string()将返回指定类的对象。该类应该扩展SimpleXMLElement类。

If only this is your goal, then simplexml does it already.

如果这只是你的目标,那么simplexml已经完成了。

Update 2: I've read some more into the bundle. It does NOT do what you want. It takes an object and the serializes it into XML/YAML, and then of course reverses that process again from those serialized states. It cannot take some random XML file and turn that into a perfect object for you.

更新2:我已经阅读了更多内容。它没有做你想要的。它接受一个对象并将其序列化为XML / YAML,然后当然从那些序列化状态再次反转该过程。它无法获取一些随机的XML文件,并将其转换为完美的对象。