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面向对象的方法重载两种版本比较
Sep 08 PHP
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
php生成静态文件的多种方法分享
Jul 17 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
功能强大的php文件上传类
Aug 29 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
购物车实现的几种方式优缺点对比
May 02 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
JS location几个方法小姐
2008/07/09 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
js图片翻书效果代码分享
2015/08/20 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
酒店办公室文员岗位职责
2013/12/18 职场文书
鲜花方阵解说词
2014/02/13 职场文书
《影子》教学反思
2014/02/21 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
电子商务专业自荐信
2014/06/02 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
化妆品促销活动总结
2015/05/07 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android