Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83305
  • 博文数量: 56
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 730
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-06 14:50
文章分类
文章存档

2013年(56)

我的朋友

分类: PHP

2013-08-28 17:25:35

最近公司要做一个API接口,输出格式要有JSON与XML格式, 在PHP中,输入JSON直接json_encode就可以,但输出XML没有提供函数,于是决定自己写一个。
  
/**
 * 数组转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;
    } 
阅读(746) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~