Symfony,使用数组将对象序列化为保留属性和结构的 XML

The*_*Man 1 php xml serialization symfony

我正在使用 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>
Run Code Online (Sandbox Code Playgroud)

以下是我的类:“item”节点的 Item、“uitem”节点的 Uitem 和 Model,以包含所有这些节点:

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

这是我得到的结果:

<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>
Run Code Online (Sandbox Code Playgroud)

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

这是我的问题:

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

根据记录,我使用的是普通序列化器,这里没有 JMS。

提前致谢。

Dun*_*moo 5

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

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

给我:

<?xml version="1.0"?>
<response>
  <something foo="bar">
    <yoo>bar</yoo>
  </something>
</response>
Run Code Online (Sandbox Code Playgroud)