Symfony将xml默认命名空间反序列化为对象

时间:2017-09-11 09:31:15

标签: php xml symfony serialization namespaces

给出两个xml文件,它们具有不同格式的相同信息。两者都应该反序列化到同一个Symfony实体中:

1

<?xml version="1.0" encoding="iso-8859-1" ?>
<Request xmlns:dxn="http://defaultxmlnamespace.org" xmlns:axn="http://anotherxmlnamespace.org">
    <dxn:Id>123456</dxn:Id>
    <axn:Name>JohnDoe</axn:Name>
</Request>

2

<?xml version="1.0" encoding="iso-8859-1" ?>
<Request xmlns="http://defaultxmlnamespace.org" xmlns:axn="http://anotherxmlnamespace.org">
    <Id>123456</Id>
    <axn:Name>JohnDoe</axn:Name>
</Request>

在第一个示例中,命名空间使用前缀&#34; dxn&#34;注册,而在第二个示例中,它被设置为默认命名空间。我的实体(没有getter / setter)看起来像:

private $dxnId;
private $axnName;

我使用&#34; NameConverterInterface&#34;转换节点名称来自&#34; dxn:Id&#34;到&#34; dxnId&#34;因为冒号不能在实体元素名称中使用。但这在两种情况下都不起作用,因为前缀&#34; dxn&#34;仅在示例no中由Serializer知道。 1。

我的解决方法是将数据映射到数组并在将数据映射到实体之前对其进行操作。我认为,在Entity元素名称中保存命名空间不是最佳选择,但我必须保存命名空间信息以便以后进行序列化。

那么反序列化这种结构的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果合适,您可以将JMSSerializer依赖项包含到项目中以管理xml到实体的序列化/反序列化。它是一个非常强大的序列化工具,它具有特殊的@XmlNamespace注释和tag参数,可以解决您的问题。以下是链接:https://jmsyst.com/libs/serializer