JMS序列化程序,反序列化和xpath

时间:2018-05-21 12:10:16

标签: php symfony php-7 jmsserializerbundle jms-serializer

所以我有这个示例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 为空。

问题是,是否有任何方法可以在没有中间类/实体的情况下填写该字段?

1 个答案:

答案 0 :(得分:0)

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

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