Сериализатор JMS, десериализация и xpath

Итак, у меня есть этот образец XML:

<a>
    <bb>
        <b><c>bc1</c></b>
        <b><c>bc2</c></b>
        <b><c>bc3</c></b>
    </bb>
    <cc>
        <bb>
            <b><c>cbc1</c></b>
            <b><c>cbc2</c></b>
            <b><c>cbc3</c></b>
        </bb>
    </cc>
</a>

И это две сущности. Материнская организация:

<?php
final class A
{
    /**
     * @JMS\Type("array<B>")
     * @JMS\XmlList(entry = "b")
     * @JMS\SerializedName("bb")
     */
    private $bb;
    /**
     * @JMS\Type("array<B>")
     * @JMS\XmlList(entry = "b")
     * @JMS\SerializedName("cc/bb")
     */
    private $cc;
}

и дочерний объект:

final class B {
    /**
     * @var string
     *
     * @ORM\Column(type = "string", length=24)
     * @JMS\Type("string")
     * @JMS\SerializedName("c")
     */
    private $c;
}

Проблема в том, что после десериализации моего xml

    $object = $this->serializer->deserialize($xml, A::class, 'xml');

Я получил свойство BB гидратировано, как я ожидал, но свойство cc пусто.

Вопрос в том, есть ли способ заполнить это поле без промежуточного класса / объекта?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
381
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это можно сделать аналогично https://stackoverflow.com/a/51766169/2034213, изменив проанализированные данные XML перед началом десериализации. Здесь вы должны использовать прослушиватель pre_deserialize, чтобы переместить cc/bb, чтобы он стал прямым потомком a, с именем, например, ccbb и измените аннотацию $a на @JMS\SerializedName("ccbb")

Однако есть одно болезненное отличие от другого вопроса, связанного выше: при добавлении простого элемента с текстовым содержимым с SimpleXML легко перемещаться по поддереву элементов можно сделать только рекурсивно воссоздавая элементы, один за другим.

Другие вопросы по теме