首页 > 解决方案 > 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是空的。

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

标签: phpsymfonyphp-7jmsserializerbundlejms-serializer

解决方案


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

然而,与上面链接的另一个问题有一个令人痛苦的区别:虽然使用 SimpleXML 添加带有文本内容的简单元素很容易,但在元素的子树中移动只能通过递归地一个一个地重新创建元素来完成


推荐阅读