Десериализуйте 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.
1 answers
Из-за природы XML, то, что вы хотите, невозможно. Вам всегда понадобится что-то для перевода object -> xml и xml -> object.
Мое предложение для вас было бы классом, который работает как коллекция и заботится о ней для вас, сохраняя список объектов в качестве свойства, которое может быть создано из ввода xml и создавать вывод xml из существующих объектов.
Альтернативой (если вам действительно больше не нужно иметь его в виде xml) было бы просто сериализовать объекты и храните их таким образом или разделяйте массив (или объект коллекции), если вы хотите, чтобы они были все сразу. Простые функции сериализации() и несериализации() из PHP сделают свое дело. Поскольку это только данные, вам даже не нужны методы сериализации и несериализации в вашем классе.
Обновление: Если это только перенос XML в объект, то simplexml уже охватил вас: http://www.php.net/manual/en/function.simplexml-load-string.php
Второй параметр - это имя класса.
Цитата: Вы можете использовать этот необязательный параметр, чтобы функция simplexml_load_string() возвращала объект указанного класса. Этот класс должен расширять класс SimpleXMLElement.
Если только это ваша цель, то simplexml уже делает это.
Обновление 2: Я прочитал еще кое-что в пакете. Он НЕ делает того, чего вы хотите. Он берет объект и сериализует его в XML/YAML, а затем, конечно, снова отменяет этот процесс из тех сериализованные состояния. Он не может взять какой-то случайный XML-файл и превратить его в идеальный объект для вас.