本文实例讲述了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数组生成xml格式数据的封装类实例。