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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
PHP XML操作类DOMDocument
Dec 16 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
laravel学习教程之存取器
Jul 30 PHP
php对接java现实加签验签的实例
Nov 25 PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 PHP
php异常处理捕获错误整理
Sep 23 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 PHP
深入分析PHP设计模式
Jun 15 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
dedecms模版制作使用方法
2007/04/03 PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python的time模块中的常用方法整理
2015/06/18 Python
Python实现自动发送邮件功能
2021/03/02 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Django 实现图片上传和下载功能
2020/12/31 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
自荐书范文范例
2014/02/13 职场文书
电力安全事故反思
2014/04/27 职场文书
拉拉队口号
2014/06/16 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
成绩报告单家长评语
2014/12/30 职场文书
毕业典礼邀请函
2015/01/31 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
初中数学教学反思范文
2016/02/17 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python