You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.1 KiB
127 lines
3.1 KiB
8 months ago
|
<?php
|
||
|
/**
|
||
|
*
|
||
|
*
|
||
|
* @author 14042058
|
||
|
* @date 2014-6-30
|
||
|
*/
|
||
|
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);
|
||
|
self::$doc->appendChild($node);
|
||
|
|
||
|
return self::$doc->saveXML();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 递归转换
|
||
|
*
|
||
|
* @param array $array 数组
|
||
|
* @param string $nodeName 节点名称
|
||
|
*
|
||
|
* @return object (DOMElement)
|
||
|
*/
|
||
|
private static function convert($array, $nodeName,$parentNode) {
|
||
|
if (!is_array($array)) return false;
|
||
|
|
||
|
//创建父节点
|
||
|
$node = self::createNode($nodeName);
|
||
|
|
||
|
//循环数组
|
||
|
foreach ($array as $key => $value) {
|
||
|
if(is_numeric($key)){
|
||
|
if (!is_array($value)) {
|
||
|
$element = self::createNode($nodeName);
|
||
|
$element->appendChild(self::createValue($value));
|
||
|
$parentNode->appendChild($element);
|
||
|
}else{
|
||
|
$parentNode->appendChild(self::convert($value, $nodeName,$parentNode));
|
||
|
}
|
||
|
}else{
|
||
|
//如果不是数组,则创建节点的值
|
||
|
if (!is_array($value)) {
|
||
|
$element = self::createNode($key);
|
||
|
$element->appendChild(self::createValue($value));
|
||
|
$node->appendChild($element);
|
||
|
} else {
|
||
|
//如果是数组,则递归
|
||
|
if(is_numeric(current(array_keys($value)))){
|
||
|
self::convert($value, $key,$node);
|
||
|
}else{
|
||
|
$node->appendChild(self::convert($value, $key,$node));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $node;
|
||
|
}
|
||
|
|
||
|
private static function createNode($name) {
|
||
|
$node = NULL;
|
||
|
|
||
|
//如果是字符串,则创建节点
|
||
|
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->createTextNode($value ? 'true' : 'false');
|
||
|
} else {
|
||
|
//如果含有HTML标签,则创建CDATA节点
|
||
|
if (strpos($value, '<') > -1) {
|
||
|
$textNode = self::$doc->createCDATASection($value);
|
||
|
} else {
|
||
|
$textNode = self::$doc->createTextNode($value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $textNode;
|
||
|
}
|
||
|
}
|
||
|
?>
|