根据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([email protected])
  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. ?>

你可能感兴趣的:(xml,PHP,数组,职场,休闲)