根據PHP數組生成XML的類

本類庫用來直接由 PHP數組生成XML文件。
演示: http://www.cn09.com/media/demo/testXML.php

本帖爲簡單( www.cn09.com)原創,轉載請保留連接,使用本類庫時請遵循LGPL協議
類庫代碼:MakeXML.php:
  1. <?php
  2. /**
  3. * MakeXML
  4. *
  5. * @author Lin Jiong(slime09@gmail.com)
  6. * @version v1.0
  7. * @license Copyright (c) 2009 Lin Jiong (www.cn09.com)
  8. * The LGPL (http://www.gnu.org/licenses/lgpl.html) 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. ?>
相關文章
相關標籤/搜索