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新手上路(三)
Oct 09 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
php 表单数据的获取代码
Mar 10 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
php连接mssql数据库的几种方法
Feb 21 PHP
php按单词截取字符串的方法
Apr 07 PHP
php简单生成随机数的方法
Jul 30 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
php封装一个异常的处理类
Jun 08 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
PHP+DBM的同学录程序(3)
2006/10/09 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
Js实现自定义右键行为
2015/03/26 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python回调函数用法实例详解
2015/07/02 Python
python批量下载抖音视频
2019/06/17 Python
Python os模块常用方法和属性总结
2020/02/20 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
英国网上超市:Ocado
2020/03/05 全球购物
2014年四风问题自我剖析材料
2014/09/15 职场文书
机动车登记业务委托书
2014/10/08 职场文书
员工评语范文
2014/12/31 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
秋菊打官司观后感
2015/06/03 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书