Symfony 序列化器 XML 属性

问题描述 投票:0回答:2

我想使用 Symfony XML Serializer 来转换类实例(而不是数组)。例如,我想创建一个像这样带有属性 myAtt="foo" 的 XML,

<?xml version="1.0"?>
<REQ>
    <TravelAgencySender myAtt="foo">
        <CityName>town</CityName>
        <AgencyID>agency</AgencyID>
    </TravelAgencySender>   
</REQ>

所以我创建了一个像这样的类

class TravelAgencySender 
{

    /**
     * @var string
     */
    private  $CityName;
    /**
     * @var string
     */
    public  $AgencyID;
.....
}

以及下面的初始化

use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
use Doctrine\Common\Annotations\AnnotationReader;



$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));

$metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);

$serializer = new Serializer(
    [new ObjectNormalizer($classMetadataFactory, $metadataAwareNameConverter)],
    ['json' => new JsonEncoder(), 'xml' => new XmlEncoder()]
);

有人知道如何添加 myAtt 属性吗?

谢谢

这会产生以下 XML

<?xml version="1.0"?>
<REQ>
    <TravelAgencySender>
        <CityName>town</CityName>
        <AgencyID>agency</AgencyID>
    </TravelAgencySender>   
</REQ>
xml symfony serialization
2个回答
0
投票

以 @ 开头的数组键被视为 XML 属性:

['foo' => ['@bar' => 'value']];

编码如下:

<?xml version="1.0"?>
<response>
     <foo bar="value"/>
</response>

0
投票

您必须按如下方式使用 SerializedName:

use Symfony\Component\Serializer\Annotation\SerializedName;
    
class TravelAgencySender 
    {
        /**
         * @SerializedName("@myAtt")
         * @var string
         */
        private  $foo;
        /**
         * @var string
        */
        private  $CityName;
        /**
         * @var string
         */
        public  $AgencyID;
    .....
    }
© www.soinside.com 2019 - 2024. All rights reserved.