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 的子树中移动。
所以我有这个样本 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 的子树中移动。