免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1020 | 回复: 0
打印 上一主题 下一主题

关于XML转换成数组 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-03 14:18 |只看该作者 |倒序浏览

关于XML转换成数组
新版和旧版的ThinkPHP在处理XML方面差异较大,我们以XML数据转换成数组为例,两者都使用了递归实现,我们看看不同的版本下面的实现方法。
旧版处理XML转换成数组的方式是使用XML 语法解析函数,用到了xml_parser_create、xml_parser_set_option、xml_parse_into_struct等函数,写法比较复杂,好处是可以兼容PHP4。
function xml_to_array($xml)
    {
        $values = array();
        $index  = array();
        $array  = array();
        $parser = xml_parser_create();
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        if(0===xml_parse_into_struct($parser, $xml, $values, $index)) {
            return false;
        }
        xml_parser_free($parser);
        $i = 0;
        $name = $values[$i]['tag'];
        $array[$name] = isset($values[$i]['attributes']) ? $values[$i]['attributes'] : '';
        $array[$name] = struct_to_array($values, $i);
        return $array[$name];
    }
    function struct_to_array($values, &$i)
    {
        $child = array();
        if (isset($values[$i]['value'])) array_push($child, $values[$i]['value']);
        while ($i++ )) {
            switch ($values[$i]['type']) {
                case 'cdata':
                    array_push($child, $values[$i]['value']);
                    break;
              case 'complete':
                    $name = $values[$i]['tag'];
                  if( !empty($name)){
                        $child[$name]= isset($values[$i]['value'])?($values[$i]['value']):'';
                        if(isset($values[$i]['attributes'])) {
                            $child[$name] = $values[$i]['attributes'];
                        }
                    }
                    break;
                case 'open':
                    $name = $values[$i]['tag'];
                    $size = isset($child[$name]) ? sizeof($child[$name]) : 0;
                    $child[$name][$size] = struct_to_array($values, $i);
                    break;
                case 'close':
                    return $child;
                    break;
            }
        }
        return $child;
    }
新版ThinkPHP采用了SimpleXML类库函数,仅仅使用了simplexml_load_string函数,除了写法简化不少,效率也有数量级的提高(对于大的XML数据解析尤其明显),不过只能用于PHP5以上版本。
function xml_to_array($xml)
{
  $array = (array)(simplexml_load_string($xml));
  foreach ($array as $key=>$item){
    $array[$key]  =  struct_to_array((array)$item);
  }
  return $array;
}
function struct_to_array($item) {
  if(!is_string($item)) {
    $item = (array)$item;
    foreach ($item as $key=>$val){
      $item[$key]  =  struct_to_array($val);
    }
  }
  return $item;


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16928/showart_516259.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP