Я собираю некоторые данные в формате 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.
Из-за характера XML точная вещь, которую вы хотите, невозможна. Вам всегда нужно что-то перевести объект -> xml и xml -> object.
Мое предложение для вас было бы классом, который работает как сборник и заботится о нем для вас, сохраняя список объектов как свойства, который можно создать из ввода xml и создать xml-вывод из существующих объектов.
Альтернативный вариант (если вам действительно не нужно иметь его как xml больше) будет просто сериализовать объекты и сохранить их таким образом, или искупить массив (или объект коллекции), если вы хотите, чтобы все они были сразу. Функции plain 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 и превратить это в идеальный объект для вас.