使用属性序列化 XML 文档

Pet*_*ore 3 php xml serialization symfony

我正在尝试序列化包含要插入 Doctrine MySQL 数据库的实体的 XML 文档。

例如,我的实体中有这两个属性:

  • $companyId
  • $公司名称

问题是,而不是像这样进入我的 XML 文档:

<company>
    <id>8888</id>
    <name>MyCompany</name>
</company>
Run Code Online (Sandbox Code Playgroud)

我得到了这样的东西:

<company id="8888" name="MyCompany"/>
Run Code Online (Sandbox Code Playgroud)

XML 是由我合作的一家独立公司生成的;所以我无法改变它。所以 Symfony2 序列化器正在创建一个空$company属性 :(

有没有一种简单的方法可以像我想要的那样对序列化过程进行服装化?还是我必须实现一个完整的独立方法?

非常感谢。

Tac*_*sky 8

现在已经很多了通过使用带有“@”的 @SerializeName 注释来序列化 XML 属性要容易

在您的 Company 实体中,定义 $name 时,添加

    /**
     * @ORM\Column(type="string", length=255)
     * @SerializedName('@name')
     */
    private $name;
Run Code Online (Sandbox Code Playgroud)

现在,当您序列化为 XML 时,它将按预期作为属性出现。

我知道OP实际上是在询问反序列化,但希望这对正在搜索的人有所帮助。


Tou*_*uki 5

我想创建一个简单的解归因为属性已经默认解析XmlEncoder。它@在键的开头添加了一个特殊字符。

无需进行大量调整,您就可以添加一个上下文参数,就像use_attributes您的自定义非规范化器可以理解的那样。这是一个例子

use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;

class AttributesDenormalizer implements DenormalizerInterface
{
    public function __construct(DenormalizerInterface $delegate)
    {
        $this->delegate = $delegate;
    }

    public function denormalize($data, $class, $format = null, array $context = array())
    {
        if (!is_array($data) || !isset($context['use_attributes']) || true !== $context['use_attributes']) {
            return $this->delegate->denormalize($data, $class, $format, $context);
        }

        $attributes = array();

        foreach ($data as $key => $value) {
            if (0 === strpos($key, '@')) {
                $attributes[substr($key, 1)] = $value;
            }
        }

        if (empty($attributes)) {
            $attributes = $data;
        }

        return $this->delegate->denormalize($attributes, $class, $format, $context);
    }

    public function supportsDenormalization($data, $type, $format = null)
    {
        return $this->delegate->supportsDenormalization($data, $type, $format);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个使用示例

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

$xml = '<company id="8888" name="MyCompany"/>';

$encoders = array(new XmlEncoder());
$normalizers = array(new AttributesDenormalizer(new GetSetMethodNormalizer));

$serializer = new Serializer($normalizers, $encoders);
$serializer->deserialize($xml, 'Company', 'xml', array('use_attributes' => true));
Run Code Online (Sandbox Code Playgroud)

这导致

class Company#13 (2) {
  protected $id =>
  string(4) "8888"
  protected $name =>
  string(9) "MyCompany"
}
Run Code Online (Sandbox Code Playgroud)