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 相关文章推荐
php session和cookie使用说明
Apr 07 PHP
PHP strncasecmp字符串比较的小技巧
Jan 04 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
destoon找回管理员密码的方法
Jun 21 PHP
php中静态类与静态变量用法的区别分析
Jan 15 PHP
PHP使用递归生成文章树
Apr 21 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
header与缓冲区之间的深层次分析
Jul 30 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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 日期时间函数的高级应用技巧
2009/10/10 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
php批量删除操作代码分享
2017/02/26 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
如何通过Python实现标签云算法
2019/07/02 Python
python监控nginx端口和进程状态
2019/09/06 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
python3中编码获取网页的实例方法
2020/11/16 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
化学教学随笔感言
2014/02/19 职场文书
四群教育工作实施方案
2014/03/26 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
外出学习心得体会范文
2016/01/18 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python