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边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
Yii核心验证器api详解
Nov 23 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
Laravel事件监听器用法实例分析
Mar 12 PHP
PHP封装cURL工具类与应用示例
Jul 01 PHP
laravel 解决crontab不执行的问题
Oct 22 PHP
PHP设计模式入门之状态模式原理与实现方法分析
Apr 26 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实现设计模式中的单例模式详解
2014/10/11 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python获得图片base64编码示例
2014/01/16 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python实现员工管理系统
2018/01/11 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
Python WEB应用部署的实现方法
2019/01/02 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
python计算二维矩形IOU实例
2020/01/18 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
领导视察欢迎词
2014/01/15 职场文书
简短大学毕业感言
2014/01/18 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android