Symfony,使用数组将对象序列化为 XML 保留属性和结构
Symfony, serialize object with arrays as XML preserving attributes and structure
我正在使用 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>
这是我的 classes:"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');
}
}
除了我在项目 class 中留下评论的问题(如何将节点值放在那里)我认为应该正确序列化所以...
$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" 创建了两个单独的节点,而不是将它们分组为一个节点。
这是我的问题:
- 我可以把两个 "item" 合并成一个 "data_list" 吗?如果可以,怎么办?
- 如何指定项目节点的值(而不是仅其属性)以保留所需的结构?
- 如何更改根节点名称并为其添加属性?
郑重声明,我使用的是 vanilla 序列化器,这里没有 JMS。
提前致谢。
JMSSerializer 就是为这些目的而创建的。而且我认为你应该开始在你的项目中使用它。它没有开销并且易于使用。
您可以使用注释控制序列化选项:
http://jmsyst.com/libs/serializer/master/reference/annotations
使用 Symfony XmlEncoder,我能够构建一个数组并使用编码方法将其转换为 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>
我正在使用 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>
这是我的 classes:"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');
}
}
除了我在项目 class 中留下评论的问题(如何将节点值放在那里)我认为应该正确序列化所以...
$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" 创建了两个单独的节点,而不是将它们分组为一个节点。
这是我的问题:
- 我可以把两个 "item" 合并成一个 "data_list" 吗?如果可以,怎么办?
- 如何指定项目节点的值(而不是仅其属性)以保留所需的结构?
- 如何更改根节点名称并为其添加属性?
郑重声明,我使用的是 vanilla 序列化器,这里没有 JMS。
提前致谢。
JMSSerializer 就是为这些目的而创建的。而且我认为你应该开始在你的项目中使用它。它没有开销并且易于使用。
您可以使用注释控制序列化选项: http://jmsyst.com/libs/serializer/master/reference/annotations
使用 Symfony XmlEncoder,我能够构建一个数组并使用编码方法将其转换为 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>