Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:将对象解析为XML(带属性)_Php_Xml - Fatal编程技术网

PHP:将对象解析为XML(带属性)

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 但我想实现

这就是我想要解析为XML的php对象

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
package
xml\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属性。