【问题标题】:Deserialize xml to object with Symfony2使用 Symfony2 将 xml 反序列化为对象
【发布时间】:2012-04-11 22:00:45
【问题描述】:

我通过 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 解析器。

【问题讨论】:

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


    【解决方案1】:

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

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

    另一种方法(如果您不再需要将其作为 xml 文件)将简单地序列化对象并以这种方式存储它们,或者如果您想要一次全部序列化数组(或集合对象)。 PHP 中的普通 serialize() 和 unserialize() 函数可以解决问题。由于它只是数据,因此您甚至不需要类中的方法序列化和反序列化。

    更新:如果只是将 XML 放入一个对象中,那么 simplexml 已经为您提供: http://www.php.net/manual/en/function.simplexml-load-string.php

    第二个参数是类名。

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

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

    更新 2:我已经阅读了更多内容。它不会做你想做的事。它需要一个对象并将其序列化为 XML/YAML,然后当然会从这些序列化状态再次反转该过程。它不能把一些随机的 XML 文件变成一个完美的对象。

    【讨论】:

    • 不客气。您可以通过投票并接受它来感谢我:)
    • 事实上,我错过了我的镜头 :) 这是我的评论:感谢您的回答。事实上,显示的类只是一个示例,这两个功能是简单的尝试。我不想使用自制函数对 xml 进行序列化/反序列化。我确实知道 JMSSerializerBundle 可以提供我想要的东西,但我没有成功地正确使用它......我特别在寻找 JMSSB 使用的示例或“自动”执行它的另一种方式,可以通过/通过 Symfony2 进行扩展。跨度>
    • 添加了一个关于 simplexml 做你已经需要的事情的小编辑。
    • 谢谢!我会更好地了解 simplexml 之类的工具。
    猜你喜欢
    • 2013-03-24
    • 2020-05-10
    • 1970-01-01
    • 2015-12-23
    • 2012-11-22
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多