Десериализовать xml в объект с помощью Symfony2

Я собираю некоторые данные в формате xml через API и хотел бы десериализовать их в списке объектов. Я использую 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.


person Mikolaj    schedule 11.04.2012    source источник


Ответы (1)


Из-за природы XML то, что вам нужно, невозможно. Вам всегда нужно что-то переводить объект -> xml и xml -> объект.

Мое предложение для вас было бы классом, который работает как коллекция и заботится о ней для вас, храня список объектов в качестве свойства, которое можно создать из ввода xml и создать вывод xml из существующих объектов.

Альтернативой (если вам больше не нужно иметь его как xml) будет просто сериализовать объекты и хранить их таким образом или сериализовать массив (или объект коллекции), если вы хотите их все сразу. Простые функции serialize() и unserialize() из PHP сделают свое дело. Поскольку это только данные, вам даже не нужны методы сериализации и десериализации в вашем классе.

Обновление: если вам нужно только преобразовать XML в объект, то simplexml уже вам поможет: http://www.php.net/manual/en/function.simplexml-load-string.php

Второй параметр — имя класса.

Цитата: Вы можете использовать этот необязательный параметр, чтобы функция simplexml_load_string() возвращала объект указанного класса. Этот класс должен расширять класс SimpleXMLElement.

Если только это ваша цель, то simplexml уже это делает.

Обновление 2: я кое-что прочитал в комплекте. Это НЕ делает то, что вы хотите. Он берет объект и сериализует его в XML/YAML, а затем, конечно, снова отменяет этот процесс из этих сериализованных состояний. Он не может взять какой-то случайный файл XML и превратить его в идеальный объект для вас.

person Christian Riesen    schedule 12.04.2012
comment
Пожалуйста. Вы можете поблагодарить меня, проголосовав за него и приняв его :) - person Christian Riesen; 12.04.2012
comment
На самом деле, я промахнулся :) Вот мой комментарий: Спасибо за ответ. На самом деле отображаемый класс является просто примером, а 2 функции — это простые попытки. Я не хочу сериализовать/десериализовать в/из xml с помощью самодельных функций. Я знаю, что JMSSerializerBundle может предоставить то, что я хочу, но мне не удалось использовать его должным образом... Я особенно ищу пример использования JMSSB или другой способ сделать это автоматически, что-то масштабируемое с/через Symfony2. - person Mikolaj; 12.04.2012
comment
Добавлено небольшое редактирование о том, что simplexml уже делает то, что вам нужно. - person Christian Riesen; 15.04.2012
comment
Спасибо ! Я лучше посмотрю на такие инструменты, как simplexml. - person Mikolaj; 16.04.2012