返回列表 发帖

根据PHP数组生成XML的类

本类库用来直接由PHP数组生成XML文件。
演示:http://www.cn09.com/media/demo/testXML.php

类库代码:MakeXML.php:
  1. <?php

  2. /**

  3. * MakeXML

  4. *

  5. * @author Lin Jiong([email]slime09@gmail.com[/email])

  6. * @version v1.0

  7. * @license Copyright (c) 2009 Lin Jiong ([url]www.cn09.com[/url])

  8. * The LGPL ([url]http://www.gnu.org/licenses/lgpl.html[/url]) licenses.

  9. */



  10. /*

  11. * 从数组生成XML文件

  12. */

  13. class Fwcms_MakeXML

  14. {

  15.     private static $instance;

  16.         

  17.     private function __construct(){}



  18.     /**

  19.      * 单件模式调用本类

  20.      *

  21.      * @return 单件模式

  22.      */

  23.     public static function getInstance() {

  24.         if (!isset(self::instance)) {

  25.             self::instance = new Fwcms_MakeXML();

  26.         }

  27.         return self::instance;

  28.     }

  29.      

  30.     /**

  31.      * 获取XML字串

  32.      * @param $array 用于生成XML的数组,数组可以是二维或多维的,其中的第一个元素作为XML元素名

  33.      * @param $xslName XSL文件名(如:"http://www.xxx.com/templates/normal/xslname.xsl")

  34.      * @return $XMLString 输出XML字符串

  35.      */

  36.     public function getXML($array,$xslName=""){

  37.         $XMLString = '<?xml version="1.0" encoding="utf-8"?>';

  38.         if($xslName!="")

  39.             $XMLString.='<?xml-stylesheet type="text/xsl" href="'.$xslName.'"?>';

  40.         $XMLString.=$this->make($array);

  41.         return $XMLString;

  42.     }

  43.    

  44.     /*

  45.      * 递归生成XML字串

  46.      */

  47.     private function make($array)

  48.     {

  49.         $XMLString='';

  50.         $haveRightBracket=FALSE;



  51.         if(isset($array['elementName'])){

  52.             $elementName=array_shift($array);//数组的第一个元素为XML元素名

  53.         }else{

  54.             $elementName='item';//如果没有指定则元素名为item

  55.         }

  56.         $XMLString.='<'.$elementName.' ';

  57.         if(is_array($array)){

  58.         foreach($array as $paramKey=>$nodeParam){

  59.                 if(!is_array($nodeParam)){

  60.                     //如果不是一个下级元素,那就是元素的参数

  61.                     $XMLString.=$paramKey.'="'.$nodeParam.'" ';

  62.                 }else{

  63.                     if(!$haveRightBracket){

  64.                         $XMLString.='>';

  65.                         $haveRightBracket=TRUE;

  66.                     }

  67.                     //如果是下级元素,则追加元素

  68.                     $XMLString.=$this->make($nodeParam);

  69.                 }

  70.             }

  71.         }

  72.         if(!$haveRightBracket){

  73.             $XMLString.='>';

  74.             $haveRightBracket=TRUE;

  75.         }        

  76.         $XMLString.='</'.$elementName.'>';//该元素处理结束

  77.         return $XMLString;

  78.     }

  79.    

  80.     /**

  81.      * 将字串保存到文件

  82.      * @param $fileName 文件名

  83.      * @param $XMLString 已经生成的XML字串

  84.      */

  85.     public function saveToFile($fileName,$XMLString)

  86.     {

  87.         if(!$handle=fopen($fileName,'w'))

  88.         {

  89.             return FALSE;

  90.         }

  91.         if(!fwrite($handle,$XMLString))

  92.         {

  93.             return FALSE;

  94.         }

  95.         return TRUE;

  96.     }

  97.    

  98.     /**

  99.      * 直接通过数组生成XML文件

  100.      */

  101.     public function write($fileName,$array,$xslName=''){

  102.         $XMLString=$this->getXML($array,$xslName);

  103.         $result=$this->saveToFile($fileName,$XMLString);

  104.         return $result;

  105.     }

  106. }
复制代码
测试代码testXML.php:
  1. <?php

  2. require_once 'MakeXML.php';

  3. $xml=Fwcms_MakeXML::getInstance();

  4. //$xml=new Fwcms_MakeXML();

  5. $array=array(

  6.         'elementName'=>'data',//XML节点名,如不定义则默认为ITEM

  7.         'test1'=>array(

  8.             //不定义本节点名

  9.             //'elementName'=>'item1',

  10.             'id'=>1,

  11.             'title'=>'try1'

  12.         ),

  13.         'test2'=>array(

  14.             'elementName'=>'item2',

  15.             'id'=>2,//参数

  16.             'title'=>'try2',//参数

  17.             'test2.2'=>array(

  18.                 //XML子节点,必须放在所有参数之后,后面不可以再跟参数

  19.                 'elementName'=>'item2.2',

  20.                 'id'=>2.2,

  21.                 'title'=>'try2.2'

  22.             )

  23.         ),

  24.         'test3'=>array(

  25.             'elementName'=>'item3',

  26.             'id'=>3,

  27.             'title'=>'try3'

  28.         ),

  29.         'test4'=>array(

  30.             'elementName'=>'item4',

  31.             'id'=>4,

  32.             'title'=>'try4'

  33.         ),

  34.         'test5'=>array(

  35.             //不定义本节点名

  36.             //'elementName'=>'item5',

  37.             'id'=>5,

  38.             'title'=>'try5'

  39.         )

  40.     );

  41. $string=$xml->getXML($array);//由数组生成XML字串

  42. $xml->saveToFile('test.xml',$string);//把生成的XML字串写入到文件

  43. $xml->write('test2.xml',$array,'test2.xsl');//直接从数组中获取字串生成文件

  44. header ("content-type: text/xml");

  45. echo $string;

  46. ?>
复制代码

返回列表