PHP:将对象解析为XML(带属性)
这就是我想要解析为XML的php对象PHP:将对象解析为XML(带属性),php,xml,Php,Xml,这就是我想要解析为XML的php对象 class HotelType { public $Provider = null; public $BookingCode = null; } 不幸的是,输出如下所示: <Hotel> <Provider>Company</Provider> <BookingCode>123</BookingCode> </Hotel> 单位 123 但我想实现
class HotelType
{
public $Provider = null;
public $BookingCode = null;
}
不幸的是,输出如下所示:
<Hotel>
<Provider>Company</Provider>
<BookingCode>123</BookingCode>
</Hotel>
单位
123
但我想实现以下目标:
<Hotel Provider="Company">
<BookingCode>123</BookingCode>
</Hotel>
123
最后,这是我使用的XMLSerializer类:
class XMLSerializer {
// functions adopted from http://www.sean-barton.co.uk/2009/03/turning-an-array-or-object-into-xml-using-php/
public static function generateValidXmlFromObj($obj, $node_block='nodes', $node_name='node') {
$arr = get_object_vars($obj);
return self::generateValidXmlFromArray($arr, $node_block, $node_name);
}
public static function generateValidXmlFromArray($array, $node_block='nodes', $node_name='node') {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
$xml .= '<' . $node_block . '>';
$xml .= self::generateXmlFromArray($array, $node_name);
$xml .= '</' . $node_block . '>';
return $xml;
}
private static function generateXmlFromArray($array, $node_name) {
$xml = '';
if (is_array($array) || is_object($array)) {
foreach ($array as $key=>$value) {
if (is_numeric($key)) {
$key = $node_name;
}
$xml .= '<' . $key . '>' . self::generateXmlFromArray($value, $node_name) . '</' . $key . '>';
}
} else {
$xml = htmlspecialchars($array, ENT_QUOTES);
}
return $xml;
}
}
类XMLSerializer{
//通过的职能http://www.sean-barton.co.uk/2009/03/turning-an-array-or-object-into-xml-using-php/
公共静态函数generateValidXmlFromObj($obj、$node\u block='nodes',$node\u name='node')){
$arr=获取对象变量($obj);
返回self::generateValidXmlFromArray($arr、$node_block、$node_name);
}
公共静态函数generateValidXmlFromArray($array、$node\u block='nodes',$node\u name='node')){
$xml='';
$xml.='';
$xml.=self::generateXmlFromArray($array,$node_name);
$xml.='';
返回$xml;
}
私有静态函数generateXmlFromArray($array,$node_name){
$xml='';
if(is_数组($array)| is_对象($array)){
foreach($key=>$value的数组){
如果(是数字($key)){
$key=$node\u name;
}
$xml.=''.self::generateXmlFromArray($value,$node_name)。'';
}
}否则{
$xml=htmlspecialchars($array,entu引号);
}
返回$xml;
}
}
要获得xml属性,我的对象应该是什么样子的?您可以安装
PEAR
packagexml\u序列化程序
- 手动安装PEAR
- 手册,如何安装
梨包装
- 链接到
XML\u序列化程序
包
如果您在ubuntu上安装了PEAR,只需输入console:
sudo pear install XML_Serializer
使用XML\u序列化程序的代码示例
:
<?php
header("Content-type: text/xml");
require_once 'XML/Serializer.php';
class HotelType
{
public $bookingCode = null;
}
class objectToXml
{
private $rootAttributes = [];
private $serializer;
public function __construct()
{
$this->serializer = new XML_Serializer();
}
public function convert($object)
{
if ($this->serializer->serialize($object)) {
return $this->serializer->getSerializedData();
}
return '';
}
public function addRootAttribute($name, $value)
{
$this->rootAttributes[$name] = $value;
$this->serializer->setOption(XML_SERIALIZER_OPTION_ROOT_ATTRIBS, $this->rootAttributes);
}
}
$hotelType = new HotelType();
$hotelType->bookingCode = "booking";
$providerName = 'name';
$providerValue = 'value';
$providerName1 = 'name1';
$providerValue1 = 'value2';
$objectToXml = new ObjectToXml();
$objectToXml->addRootAttribute($providerName, $providerValue);
$objectToXml->addRootAttribute($providerName1, $providerValue1);
echo $objectToXml->convert($hotelType);
<HotelType name="value" name1="value2">
<bookingCode>booking</bookingCode>
</HotelType>
serializer=newxml_serializer();
}
公共函数转换($object)
{
if($this->serializer->serialize($object)){
返回$this->serializer->getSerializedData();
}
返回“”;
}
公共函数addRootAttribute($name,$value)
{
$this->rootAttributes[$name]=$value;
$this->serializer->setOption(XML\u serializer\u OPTION\u ROOT\u ATTRIBS,$this->rootAttributes);
}
}
$hotelType=新的hotelType();
$hotelType->bookingCode=“预订”;
$providerName='name';
$providerValue='value';
$providerName1='name1';
$providerValue1='value2';
$objectToXml=新的objectToXml();
$objectToXml->addRootAttribute($providerName,$providerValue);
$objectToXml->addRootAttribute($providerName1,$providerValue1);
echo$objectToXml->convert($hotelType);
结果:
<?php
header("Content-type: text/xml");
require_once 'XML/Serializer.php';
class HotelType
{
public $bookingCode = null;
}
class objectToXml
{
private $rootAttributes = [];
private $serializer;
public function __construct()
{
$this->serializer = new XML_Serializer();
}
public function convert($object)
{
if ($this->serializer->serialize($object)) {
return $this->serializer->getSerializedData();
}
return '';
}
public function addRootAttribute($name, $value)
{
$this->rootAttributes[$name] = $value;
$this->serializer->setOption(XML_SERIALIZER_OPTION_ROOT_ATTRIBS, $this->rootAttributes);
}
}
$hotelType = new HotelType();
$hotelType->bookingCode = "booking";
$providerName = 'name';
$providerValue = 'value';
$providerName1 = 'name1';
$providerValue1 = 'value2';
$objectToXml = new ObjectToXml();
$objectToXml->addRootAttribute($providerName, $providerValue);
$objectToXml->addRootAttribute($providerName1, $providerValue1);
echo $objectToXml->convert($hotelType);
<HotelType name="value" name1="value2">
<bookingCode>booking</bookingCode>
</HotelType>
预订
由于我没有找到一个简单的解决方案,我自己扩展了这个方法
如果有人需要,请参阅以下源代码:
private static function generateXmlFromArray($array, $node_name) {
$xml = '';
if (is_array($array) || is_object($array)) {
foreach ($array as $key=>$value) {
if($value != null){
if (is_numeric($key)) {
$key = rtrim($node_name, "s"); //remove the plural if array
}
if(is_array($value) || is_object($value)){
$xml .= '<' . $key;
foreach ($value as $nextKey => $nextValue) {
if(strpos($nextKey, "__") !== false && $nextValue != null){
$xml .= ' ' . substr($nextKey, 2) . '="' . $nextValue . '"' ;
if(is_object($value)) $value->$nextKey = null;
else if(is_array($value)) $value[$nextKey] = null;
}
}
$xml .= '>' . self::generateXmlFromArray($value, $key) . '</' . $key . '>';
}else if($key == "_"){
$xml = self::generateXmlFromArray($value, $key);
}else{
$xml .= '<' . $key . '>' . self::generateXmlFromArray($value, $key) . '</' . $key . '>';
}
}else self::generateXmlFromArray($value, $key);
}
} else {
$xml = htmlspecialchars($array, ENT_QUOTES);
}
return $xml;
}
它将产生预期的输出:
<Hotel Provider="Company">
<BookingCode>123</BookingCode>
</Hotel>
123
为什么要手工构建XML?为什么不使用或之类的现有库?不幸的是,这不会是动态的。更新答案。您的意思是,初始化后它不能更改属性?我们可以在初始化后使用serializer->setOption()
设置属性,如果您需要在没有外部干扰的情况下将对象转换为具有设置属性的xml,您可以查看xml_serializer文档。我认为它有办法通过前缀或类似的东西来设置xml属性。