php - 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是空的。
问题是是否有任何方法可以在没有中间类/实体的情况下填写该字段?
解决方案
是的,它可以通过在反序列化开始之前修改解析的 XML 数据以类似于https://stackoverflow.com/a/51766169/2034213的方式完成。在这里,您将使用pre_deserialize
侦听器移动以成为名为 egcc/bb
的直系后代,并将 的注释更改为a
ccbb
$a
@JMS\SerializedName("ccbb")
然而,与上面链接的另一个问题有一个令人痛苦的区别:虽然使用 SimpleXML 添加带有文本内容的简单元素很容易,但在元素的子树中移动只能通过递归地一个一个地重新创建元素来完成。
推荐阅读
- google-apps-script - 如何仅将 3 行从一个选项卡移动到另一个选项卡
- javascript - 这是深度混淆吗?无法理解它的含义
- javascript - React Router 仅使用查询参数导航
- javascript - 选择 v-model 对象选择
- java - Java中的运行时多态性和动态绑定有什么区别?
- qt - Qml中的自定义标题栏
- python - 如何在 django 中正确使用 context_processor
- javascript - 如何将每个表行的数据变成不同的查询字符串并将数据传递给另一个视图
- arrays - 如何识别最后一个字母 y 的索引?
- azure-durable-functions - 持久任务发布后更新“MaxConcurrentActivityFunctions”