最近公司要做一個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; } }