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模板技术[转]
Jan 04 PHP
一步一步学习PHP(1) php开发环境配置
Feb 15 PHP
PHP 学习路线与时间表
Feb 21 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
PHP实现找出链表中环的入口节点
Jan 16 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 PHP
PHP与Web页面的交互示例详解二
Aug 04 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
加速XP搜索功能堪比vista
2007/03/22 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
PDO::rollBack讲解
2019/01/29 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
python基于socket实现网络广播的方法
2015/04/29 Python
Python pickle模块用法实例分析
2015/05/27 Python
python版百度语音识别功能
2019/07/09 Python
python speech模块的使用方法
2020/09/09 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
颁奖典礼主持词
2014/03/25 职场文书
C++程序员求职信
2014/05/07 职场文书
现实表现材料范文
2014/12/23 职场文书
优秀党支部申报材料
2014/12/24 职场文书
工程部主管岗位职责
2015/02/12 职场文书
幼师自荐信范文
2015/03/06 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Redis 哨兵集群的实现
2021/06/18 Redis
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技
JavaScript实现简单的音乐播放器
2022/08/14 Javascript