最近公司要做一個API接口,輸出格式要有JSON與XML格式, 在PHP中,輸入JSON直接json_encode就可以,但輸出XML沒有提供函數,於是決定自己寫一個。
<?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 節點名稱
*
* @return object (DOMElement)
*/
private static function convert($array, $nodeName) {
if (!is_array($array)) return false;
//創建父節點
$node = self::createNode($nodeName);
//循環數組
foreach ($array as $key => $value) {
$element = self::createNode($key);
//如果不是數組,則創建節點的值
if (!is_array($value)) {
$element->appendChild(self::createValue($value));
$node->appendChild($element);
} else {
//如果是數組,則遞歸
$node->appendChild(self::convert($value, $key, $element));
}
}
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;
}
}