【问题标题】:Symfony, serialize object with arrays as XML preserving attributes and structureSymfony,使用数组序列化对象作为 XML 保留属性和结构
【发布时间】:2015-03-27 06:53:01
【问题描述】:

我正在使用 Symfony2 并尝试将不同的对象集合序列化为 XML。为简洁起见,假设我正在尝试列出和取消列出实体,这是我想要得到的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<r someattribute="value">
    <data_list>
        <item id="9" type="a"><![CDATA[list data 1]></item>
        <item id="10" type="a"><![CDATA[list data 2]></item>
        <item id="11" type="b"><![CDATA[list data 3]></item>
    </data_list>
    <data_unlist>
        <uitem id="9" type="a" />
    </data_unlist>
</r>

这是我的类:“item”节点的 Item,“uitem”节点的 Uitem 和模型,以包含它们:

class Item
{
    private $data=array();
    public function getData() {return $this->data;}

    public function __construct($id, $type, $value)
    {
        $this->data["@id"]=$id;
        $this->data["@type"]=$type;
        //How do I put $value as the node value????
    }
}

class UItem
{
    private $data=array();
    public function getData() {return $this->data;}

    public function __construct($id, $type)
    {
        $this->data["@id"]=$id;
        $this->data["@type"]=$type;
    }
}

class Model
{
    private $data_list=array();
    private $data_unlist=array();

    public function getDataList() {return $this->data_list;}
    public function getDataUnlist() {return $this->data_unlist;}

    public function __construct()
    {
        $this->data_list[]=new Item(9, 'a', 'list data 1');
        $this->data_list[]=new Item(10, 'a', 'list data 2');
        $this->data_list[]=new Item(11, 'b', 'list data 3');

        $this->data_unlist[]=new UItem(9, 'a');
    }
}

保存我在 Item 类中留下评论的问题(如何将节点值放在那里)我认为应该正确序列化所以......

$model=new Model();
$encoders=array(new XmlEncoder());
$normalizers=array(new GetSetMethodNormalizer());
$serializer=new Serializer($normalizers, $encoders);
$contents_xml=$serializer->serialize($model, 'xml');

这是我得到的结果:

<response>
    <data_list>
        <item id="9" type="a" />
    </data_list>
    <data_list>
        <item id="11" type="b" />
    </data_list>
    <data_unlist>
        <uitem id="9" type="a" />
    </data_unlist>
</response>

如您所见,已为“data_list”创建了两个单独的节点,而不是将它们归为一个节点。

这是我的问题:

  • 我可以把这两个“项目”放到一个“data_list”中吗?如果有,怎么做?
  • 如何指定项目节点的值(而不是仅其属性)以保留所需的结构?
  • 如何更改根节点名称并为其添加属性?。

为了记录,我使用的是香草序列化程序,这里没有 JMS。

提前致谢。

【问题讨论】:

    标签: php xml symfony serialization


    【解决方案1】:

    使用 Symfony XmlEncoder 我能够构建一个数组并使用 encode 方法将其转换为 xml。任何被命名为@something 的数组项都会变成包装元素的属性而不是子元素,所以:

    $encoder = new \Symfony\Component\Serializer\Encoder\XmlEncoder();
    $data = [
      'something' => [
        '@foo' => 'bar',
        'yoo' => 'bar',
      ]
    ];
    $xml = $encoder->encode($data, 'xml');
    

    给我:

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

    【讨论】:

    • 谢谢邓肯哞。这有点晚了,但现在我再次进入 symfony,我可能会发现它很有用:)。
    【解决方案2】:

    JMSSerializer 就是为了这些目的而创建的。我认为你应该开始在你的项目中使用它。它没有开销并且易于使用。

    您可以使用注释控制序列化选项: http://jmsyst.com/libs/serializer/master/reference/annotations

    【讨论】:

    • 谢谢迈克尔...我几乎是 Symfony 的新手,但还是有点不知所措。我会看一下文档,看看它是否支持我们在这个项目中使用的 yml 注释。再次感谢。
    • 您可以使用 yml 注释进行教义映射,但可以使用 JMSSerializer 注释。但是如果你喜欢的话,JMSSerializer 可以处理xmlyml 配置。
    • 非常棒:使用注释在 30 分钟内完成工作,没有任何问题。快速、简单且功能强大!。
    • 不过 JMSSerializer 非常好,我以前用过,我用的是 Symfony symfony.com/doc/current/components/serializer.html 的 Serializer 组件。很适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多