您的位置:首页 > 编程语言 > PHP开发

php 数组转换为xml数据,已针对数组键值为数字进行处理

2015-04-23 11:06 453 查看
代码非原创,有修改。
<?php
/**
* 数组转XML类库
*
* @filesource ArrayToXML.php
* @author  gentwolf
* @version 1.0 2013/08/23
*
* 使用说明:
*  echo ArrayToXml::parse($array, 'root');
*/

class ArrayToXML {
//文档对象
private static $doc = NULL;
//版本号
private static $version = '1.0';

/**
* 初始化文档版本及编码
*
* @param string $version   版本号
* @param string $encoding  XML编码
*/
public static function init($version, $encoding) {
self::$doc = new DomDocument($version, $encoding);
self::$doc->formatOutput = true;
}

/**
* 转换数组到XML
*
* @param array $array      要转换的数组
* @param string $rootName  要节点名称
* @param string $version   版本号
* @param string $encoding  XML编码
*
* @return string
*/
public static function parse($array, $rootName = 'root', $version = '1.0', $encoding = 'UTF-8') {
self::init($version, $encoding);

//转换
$node = self::convert($array, $rootName);
self::$doc->appendChild($node);

return self::$doc->saveXML();
}

/**
* 递归转换
*
* @param array $array      数组
* @param string $nodeName  节点名称
* @param obj $pareNode  上一级节点
*
* @return object (DOMElement)
*/
private static function convert($array, $nodeName, $pareNode = NULL) {
if (!is_array($array)) return false;

//创建父节点。数组键值为数字时,不创建父节点,父节点为上一级节点
if(is_numeric($nodeName)){
$node = $pareNode;
}else{
$node = self::createNode($nodeName);
}

//循环数组
foreach ($array as $key => $value) {

if(is_numeric($key)){
//键值为数字,创建节点。
//不以数字做节点,以上一级数组键值做节点。将上一级节点当作当前节点进行操作
$node = self::createNode($nodeName);
if (!is_array($value)) {
//不是数组,则创建节点的值。
$node->appendChild(self::createValue($value));
$pareNode->appendChild($node);
} else {
//如果是数组,则递归。
$pareNode->appendChild(self::convert($value, $key, $node));
}
}else{
$element = self::createNode($key);

//如果不是数组,则创建节点的值
if (!is_array($value)) {
$element->appendChild(self::createValue($value));
$node->appendChild($element);
} else {
//如果是数组,则递归
$node->appendChild(self::convert($value, $key, $node));
}
}
}
return $node;
}

private static function createNode($name) {
$node = NULL;
$name = strtoupper($name);
//如果是字符串,则创建节点
if (!is_numeric($name)) {
$node = self::$doc->createElement($name);
} else {
//如果是数字,则创建默认item节点
$node = self::$doc->createElement('item');
}

return $node;
}

/**
* 创建文本节点
*
* @param string || bool || integer $value
*
* @return object (DOMText || DOMCDATASection );
*/
private static function createValue($value) {
$textNode = NULL;

//如果是bool型,则转换为字符串
if (true === $value || false === $value) {
$textNode = self::$doc->createCDATASection($value ? 'true' : 'false');
} else {
//创建CDATA节点
$textNode = self::$doc->createCDATASection($value);
/*
//如果含有HTML标签,则创建CDATA节点
if (strpos($value, '<') > -1) {
$textNode = self::$doc->createCDATASection($value);
} else {
$textNode = self::$doc->createTextNode($value);
}*/
}

return $textNode;
}

}

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐