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

标签 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 解析器。

最佳答案

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

我对您的建议是一个类作为集合并为您处理它,将对象列表作为属性保存,可以从 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 文件变成适合您的完美对象。

关于php - 使用 Symfony2 将 xml 反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114591/

相关文章:

javascript - jquery 显示从 php 返回的多个 json 对象

android - 仅将样式应用于特定的 TextView

Symfony 表单 mime 类型应该只接受 PDF 文件

php - Symfony2命令行生成全局文件夹下的twig模板

sql - Symfony/Doctrine : SUM and AVG score of players

php - 用 mysql 数组填充 php 表单字段(点击)

javascript - 无法在服务器中打开上传的文件

PHP 的 =& 运算符

java - 将 Jackson json 属性映射到相应的 xml 元素

java - 使用指向单个方法的按钮区分单击了android按钮数组中的哪个android按钮