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 相关文章推荐
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
ThinkPHP模型详解
Jul 27 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
php中array_fill函数的实例用法
Mar 02 PHP
PHP中SESSION过期设置
Mar 09 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
PHP pear安装配置教程
2016/05/14 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
javascript中的一些注意事项 更新中
2010/12/06 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python正则表达式分组概念与用法详解
2017/06/24 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
python 数据类型强制转换的总结
2021/01/25 Python
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
活动总结报告范文
2014/05/04 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
学校运动会感想
2015/08/10 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android