JMS 序列化器、反序列化和 xpath

JMS serializer, deserialization and 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 是空的。

问题是是否有任何方法可以在没有中介的情况下填写该字段class/entity?

是的,可以通过在反序列化开始之前修改已解析的 XML 数据,以类似于 的方式来完成。在这里,您将使用 pre_deserialize 侦听器移动 cc/bb 成为 a 的直接后代,例如命名为ccbb,将$a的注解改为@JMS\SerializedName("ccbb")

然而,与上面链接的另一个问题有一个痛苦的区别:虽然使用 SimpleXML 添加带有文本内容的简单元素很容易,但在元素 can only be done by re-creating the elements recursively, one by one 的子树中移动。