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

时间:2012-04-11 22:00:46

标签: php xml symfony xml-serialization xml-deserialization

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

我知道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;
    }
}

我想要对这种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>

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

第二个参数是类名。

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

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

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