PHP数组生成XML格式数据的封装类实例


Posted in PHP onNovember 10, 2016

本文实例讲述了PHP数组生成XML格式数据的封装类。分享给大家供大家参考,具体如下:

类库代码:MakeXML.php:

<?php
/**
* MakeXML
*
* @author Lin Jiong(slime09@gmail.com)
* @version v1.0
* @license Copyright (c) 2009 Lin Jiong (www.cn09.com)
* The LGPL (http://www.gnu.org/licenses/lgpl.html) licenses.
*/
/*
* 从数组生成XML文件
*/
class Fwcms_MakeXML
{
  private static $instance;
  private function __construct(){}
  /**
   * 单件模式调用本类
   *
   * @return 单件模式
   */
  public static function getInstance() {
    if (!isset(self::instance)) {
      self::instance = new Fwcms_MakeXML();
    }
    return self::instance;
  }
  /**
   * 获取XML字串
   * @param $array 用于生成XML的数组,数组可以是二维或多维的,其中的第一个元素作为XML元素名
   * @param $xslName XSL文件名(如:"http://www.xxx.com/templates/normal/xslname.xsl")
   * @return $XMLString 输出XML字符串
   */
  public function getXML($array,$xslName=""){
    $XMLString = '<?xml version="1.0" encoding="utf-8"?>';
    if($xslName!="")
      $XMLString.='<?xml-stylesheet type="text/xsl" href="'.$xslName.'"?>';
    $XMLString.=$this->make($array);
    return $XMLString;
  }
  /*
   * 递归生成XML字串
   */
  private function make($array)
  {
    $XMLString='';
    $haveRightBracket=FALSE;
    if(isset($array['elementName'])){
      $elementName=array_shift($array);//数组的第一个元素为XML元素名
    }else{
      $elementName='item';//如果没有指定则元素名为item
    }
    $XMLString.='<'.$elementName.' ';
    if(is_array($array)){
    foreach($array as $paramKey=>$nodeParam){
        if(!is_array($nodeParam)){
          //如果不是一个下级元素,那就是元素的参数
          $XMLString.=$paramKey.'="'.$nodeParam.'" ';
        }else{
          if(!$haveRightBracket){
            $XMLString.='>';
            $haveRightBracket=TRUE;
          }
          //如果是下级元素,则追加元素
          $XMLString.=$this->make($nodeParam);
        }
      }
    }
    if(!$haveRightBracket){
      $XMLString.='>';
      $haveRightBracket=TRUE;
    }
    $XMLString.='</'.$elementName.'>';//该元素处理结束
    return $XMLString;
  }
  /**
   * 将字串保存到文件
   * @param $fileName 文件名
   * @param $XMLString 已经生成的XML字串
   */
  public function saveToFile($fileName,$XMLString)
  {
    if(!$handle=fopen($fileName,'w'))
    {
      return FALSE;
    }
    if(!fwrite($handle,$XMLString))
    {
      return FALSE;
    }
    return TRUE;
  }
  /**
   * 直接通过数组生成XML文件
   */
  public function write($fileName,$array,$xslName=''){
    $XMLString=$this->getXML($array,$xslName);
    $result=$this->saveToFile($fileName,$XMLString);
    return $result;
  }
}

测试代码testXML.php:

<?php
require_once 'MakeXML.php';
$xml=Fwcms_MakeXML::getInstance();
//$xml=new Fwcms_MakeXML();
$array=array(
    'elementName'=>'data',//XML节点名,如不定义则默认为ITEM
    'test1'=>array(
      //不定义本节点名
      //'elementName'=>'item1',
      'id'=>1,
      'title'=>'try1'
    ),
    'test2'=>array(
      'elementName'=>'item2',
      'id'=>2,//参数
      'title'=>'try2',//参数
      'test2.2'=>array(
        //XML子节点,必须放在所有参数之后,后面不可以再跟参数
        'elementName'=>'item2.2',
        'id'=>2.2,
        'title'=>'try2.2'
      )
    ),
    'test3'=>array(
      'elementName'=>'item3',
      'id'=>3,
      'title'=>'try3'
    ),
    'test4'=>array(
      'elementName'=>'item4',
      'id'=>4,
      'title'=>'try4'
    ),
    'test5'=>array(
      //不定义本节点名
      //'elementName'=>'item5',
      'id'=>5,
      'title'=>'try5'
    )
  );
$string=$xml->getXML($array);//由数组生成XML字串
$xml->saveToFile('test.xml',$string);//把生成的XML字串写入到文件
$xml->write('test2.xml',$array,'test2.xsl');//直接从数组中获取字串生成文件
header ("content-type: text/xml");
echo $string;
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
将文件夹压缩成zip文件的php代码
Dec 14 PHP
php垃圾代码优化操作代码
Aug 05 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
浅谈php提交form表单
Jul 01 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 PHP
php实现获取近几日、月时间示例
Jul 06 PHP
tp5递归 无限级分类详解
Oct 18 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 #PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 #PHP
php事件驱动化设计详解
Nov 10 #PHP
PHP的消息通信机制测试实例
Nov 10 #PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 #PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 #PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 #PHP
You might like
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
Python中的面向对象编程详解(上)
2015/04/13 Python
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
python实现redis三种cas事务操作
2017/12/19 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
Python3 读取Word文件方式
2020/02/13 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
python利用opencv实现颜色检测
2021/02/23 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
中专生自我鉴定书范文
2013/12/28 职场文书
法制宣传教育方案
2014/05/09 职场文书
绿色环保口号
2014/06/12 职场文书
党建目标管理责任书
2014/07/25 职场文书
医德医风个人总结
2015/02/28 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
初中毕业感言300字
2015/07/31 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
拙作再改《我的收音机情缘》
2022/04/05 无线电