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的FTP学习(二)[转自奥索]
Oct 09 PHP
PHP4实际应用经验篇(2)
Oct 09 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
一款简单实用的php操作mysql数据库类
Dec 08 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
php中__toString()方法用法示例
Dec 07 PHP
asp函数split()对应php函数explode()
Feb 27 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
php引用传递
Apr 01 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生成静态html页面的原理
2016/09/30 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
jQuery 性能优化指南 (1)
2009/05/21 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
Python中暂存上传图片的方法
2015/02/18 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
分享Python文本生成二维码实例
2016/01/06 Python
python实现识别相似图片小结
2016/02/22 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python机器人行走步数问题的解决
2018/01/29 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python pandas时序处理相关功能详解
2019/07/03 Python
python安装及变量名介绍详解
2020/12/12 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
逃课上网检讨书
2014/02/20 职场文书
幼儿园招生广告
2014/03/19 职场文书
动员大会主持词
2014/03/20 职场文书
小学社团活动总结
2014/06/27 职场文书
大学生活动总结模板
2014/07/02 职场文书
学习nginx基础知识
2021/09/04 Servers
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js