首页 > 代码库 > 自定义数组转换成xml

自定义数组转换成xml

今天项目需要用到生成xml日志,种类比较多,果断自己写了个,在处理结束时,有点费力,贴出来分享一下,如果有什么错误,请指正:

测试数据:

   $data =http://www.mamicode.com/ array(‘books‘,array(‘book‘,
                     array(‘bookname‘,‘平凡的世界‘),
                   array(‘author‘,‘路遥‘),
                   array(‘pubdate‘,‘2009年‘),
                   array(‘info‘,array(‘Name‘=>‘About‘),‘1991年3月《平凡的世界》获中国第三届茅盾文学奖‘),
            
              ),array(‘book‘,
                     array(‘bookname‘,‘活着‘),
                   array(‘author‘,‘余华‘),
                   array(‘pubdate‘,‘1994年‘),
                   array(‘info‘,array(‘Name‘=>‘About‘),‘1994年由张艺谋执导,葛优、巩俐等主演‘)
             )       
            );      

 

/**
     * 创建日志XML文件
     *
     * @param  $data  array  生成的XML的源数据
     *
     * 数据格式定义约束:  
     *      1. 数据节点出现的层次必须跟xml节点的层次一致  
     *      2. 节点属性必须跟所在的节点在同一层次,但是节点作为第一个元素出现,属性节点作为后继元素出现
     *    
     *    demo: array(‘InstallationLog‘,
     *                array(‘HostIp‘,array(),‘192.168.1.107‘),
     *                array(‘ComputerName‘,array(),‘bGlwZW5nLXh5LUwx‘),
     *                array(‘OrderID‘,array(),‘R0RBWi04MTVTLTUwOTktM1JSRA==‘),
     *                array(‘UserData‘,array(‘Name‘=>‘SoftwareID‘),‘0‘),
     *                array(‘LogType‘,array(),‘0‘),
     *                array(‘Time‘,array(),‘2014-06-13 18:14:46‘),
     *                array(‘UTCMs‘,array(),‘1402654506172‘)
     *          )
     *     
     *          <?xml version="1.0" encoding="utf-8"?>
     *                <InstallationLog>
     *                    <HostIp>192.168.1.107</HostIp>
     *                    <ComputerName>bGlwZW5nLXh5LUwx</ComputerName>
     *                    <OrderID>R0RBWi04MTVTLTUwOTktM1JSRA==</OrderID>
     *                    <UserData Name="SoftwareID">0</UserData>
     *                    <LogType>0</LogType>
     *                    <Time>2014-06-13 18:14:46</Time>
     *                    <UTCMs>1402654506172</UTCMs>
     *                </InstallationLog>
     *
     *  @return string 生成的xml文件   
     */
    function createLogXmlFile(array $data,$isOnlyRoot=false){
        static $xml;
        static $outerLen = 0;
        static $count = 0;        
        
        if(!$xml){
            $xml = new XMLWriter();
            $xml->openMemory();
            $xml->setIndentString(‘  ‘);
            $xml->setIndent(true);
            $xml->startDocument(‘1.0‘, ‘utf-8‘);
        }    
        
        $length = count($data);
        
        if($outerLen ===  0){
            $outerLen = $length;    
        }
        
        for($i=0; $i<$length; $i++){
            if(is_array($data[$i]) && $data){
                if(count($data[$i]) === 1){
                    $attr_n = array_shift(array_keys($data[$i]));
                    $attr_v = array_shift(array_values($data[$i]));  
        
                      $xml->writeAttribute($attr_n,$attr_v);    
                }else{
                    createLogXmlFile($data[$i]);    
                }
            }else{
                if($i == 0){
                    $xml->startElement($data[$i]);    
                }else{
                    $xml->text($data[$i]);
                }
            }
            
            if($i === $length-1){
                if($isOnlyRoot){
                    $xml->endElement();    
                    $xml->endDocument();
                    
                    return $xml->outputMemory(false);
                }else{
                    if(is_array($data[$i])){
                        $count++;
                        
                        if($count === $outerLen){
                            $xml->endDocument();
                            return $xml->outputMemory(false);
                        }    
                    }
                    
                    $xml->endElement();    
                }
            }
        }
    }