【问题标题】:How to change node name in XML using symfony serializer?如何使用 symfony 序列化程序更改 XML 中的节点名称?
【发布时间】:2021-04-28 10:36:30
【问题描述】:

如何更改 Symfony 序列化器生成的 XML 文档的节点名称? 我用这段代码生成 XML:

final class AdsController extends AbstractController
{
    private SerializerInterface $serializer;

    public function __construct(SerializerInterface $serializer)
    {
        $this->serializer = $serializer;
        $this->normalizer = $normalizer;
    }

    public function __invoke(Request $request): Response
    {
        $ads = $this->em->findAll();
        $rootNode = [
            '@id' => 12345,
            '#' => $ads
        ];
        $res = $this->serializer->serialize($rootNode, 'xml', [
            'xml_format_output' => true,
            'xml_encoding' => 'utf-8',
            'xml_root_node_name' => 'ads'
]);

        return $res;
    }
}

$res 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<ads id="12345">
    <item></item>
</ads>

但是如何得到这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<ads id="12345">
    <ad adId="123"></ad>
</ads>

我的标准化器如下所示:

class AdNormalizer implements ContextAwareNormalizerInterface
{
    public function normalize($topic, string $format = null, array $context = [])
    {
        $data['adName'] = ...
        return $data;
    }

    public function supportsNormalization($data, string $format = null, array $context = [])
    {
        return $data instanceof Ad;
    }
}

【问题讨论】:

    标签: symfony serialization


    【解决方案1】:

    我不确定 vanilla Symfony 上下文中的细节,但这是我在 Drupal 中使用 Symfony\Component\Serializer\Encoder\XmlEncoder 的方法

      public function encode() {
        $list = [
          [
            '@id' => '123',
            'propertyOne' => 1,
            'propertyTwo' => 2,
          ],
          [
            '@id' => '456',
            'propertyOne' => 1,
            'propertyTwo' => 2,
          ],
          [
            '@id' => '789',
            'propertyOne' => 1,
            'propertyTwo' => 2,
          ]
        ];
        // The root element name defined via:
        $context[XmlEncoder::ROOT_NODE_NAME] = 'ads';
        $list = ['ad' => $list];
        
        $ads = [
          '@id' => 12345,
          '#' => $list
        ];
    
        $encoder = new \Symfony\Component\Serializer\Encoder\XmlEncoder();
        return $encoder->encode($ads, $format, $context);
      }
    

    【讨论】:

    • 非常感谢它有效,这就是我想要的
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多