【问题标题】:Symfony deserialize xml default namespace to objectSymfony 将 xml 默认命名空间反序列化为对象
【发布时间】:2018-02-19 11:59:06
【问题描述】:

给定两个 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>

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

private $dxnId;
private $axnName;

我使用“NameConverterInterface”将节点名称从“dxn:Id”转换为“dxnId”,因为冒号不能用于实体元素名称。但这在这两种情况下都不起作用,因为序列化程序仅在示例编号中知道前缀“dxn”。 1.

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

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

【问题讨论】:

    标签: php xml symfony serialization namespaces


    【解决方案1】:

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

    【讨论】:

    • 完美运行并完全按照我的意愿管理命名空间。它还解决了我的其他问题,与 JMSSerializer 一样,我可以使用 xml 之外的其他实体字段名称。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2021-11-03
    • 2015-11-03
    相关资源
    最近更新 更多