php之XML转数组函数的详解


Posted in PHP onJune 07, 2013

如下所示:

<?
/** 
* xml2array() will convert the given XML text to an array in the XML structure. 
* Link: http://www.bin-co.com/php/scripts/xml2array/ 
* Arguments : $contents - The XML text 
*                 $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. 
*                 $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance. 
* Return: The parsed XML in an array form. Use print_r() to see the resulting array structure. 
* Examples: $array =   xml2array(file_get_contents('feed.xml')); 
*               $array =   xml2array(file_get_contents('feed.xml', 1, 'attribute')); 
*/ 
function xml2array($contents, $get_attributes=1, $priority = 'tag') { 
     if(!$contents) return array(); 
     if(!function_exists('xml_parser_create')) { 
        //print "'xml_parser_create()' function not found!"; 
        return array(); 
     } 
    //Get the XML parser of PHP - PHP must have this module for the parser to work 
    $parser = xml_parser_create(''); 
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); # http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss 
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); 
    xml_parse_into_struct($parser, trim($contents), $xml_values); 
    xml_parser_free($parser); 
     if(!$xml_values) return;//Hmm... 
     //Initializations 
    $xml_array = array(); 
    $parents = array(); 
    $opened_tags = array(); 
    $arr = array(); 
    $current = &$xml_array; //Refference 
     //Go through the tags. 
    $repeated_tag_index = array();//Multiple tags with same name will be turned into an array 
    foreach($xml_values as $data) { 
         unset($attributes,$value);//Remove existing values, or there will be trouble 
         //This command will extract these variables into the foreach scope 
         // tag(string), type(string), level(int), attributes(array). 
        extract($data);//We could use the array by itself, but this cooler. 
        $result = array(); 
        $attributes_data = array();          if(isset($value)) { 
             if($priority == 'tag') $result = $value; 
             else $result['value'] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode 
        } 
        //Set the attributes too. 
        if(isset($attributes) and $get_attributes) { 
             foreach($attributes as $attr => $val) { 
                 if($priority == 'tag') $attributes_data[$attr] = $val; 
                 else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' 
            } 
         } 
        //See tag status and do the needed. 
        if($type == "open") {//The starting of the tag '<tag>' 
            $parent[$level-1] = &$current; 
             if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag 
                $current[$tag] = $result; 
                 if($attributes_data) $current[$tag. '_attr'] = $attributes_data; 
                $repeated_tag_index[$tag.'_'.$level] = 1; 
                $current = &$current[$tag]; 
             } else { //There was another element with the same tag name 
                if(isset($current[$tag][0])) {//If there is a 0th element it is already an array 
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; 
                    $repeated_tag_index[$tag.'_'.$level]++; 
                 } else {//This section will make the value an array if multiple tags with the same name appear together 
                    $current[$tag] = array($current[$tag],$result);//This will combine the existing item and the new item together to make an array 
                    $repeated_tag_index[$tag.'_'.$level] = 2; 
                     if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well 
                        $current[$tag]['0_attr'] = $current[$tag.'_attr']; 
                         unset($current[$tag.'_attr']); 
                     } 
                 } 
                $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1; 
                $current = &$current[$tag][$last_item_index]; 
             } 
         } elseif($type == "complete") { //Tags that ends in 1 line '<tag />' 
             //See if the key is already taken. 
            if(!isset($current[$tag])) { //New Key 
                $current[$tag] = $result; 
                $repeated_tag_index[$tag.'_'.$level] = 1; 
                 if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data; 
             } else { //If taken, put all things inside a list(array) 
                if(isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array... 
                     // ...push the new element into that array. 
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; 
                     if($priority == 'tag' and $get_attributes and $attributes_data) { 
                        $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; 
                     } 
                    $repeated_tag_index[$tag.'_'.$level]++; 
                 } else { //If it is not an array... 
                    $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value 
                    $repeated_tag_index[$tag.'_'.$level] = 1; 
                     if($priority == 'tag' and $get_attributes) { 
                         if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well 
                            $current[$tag]['0_attr'] = $current[$tag.'_attr']; 
                             unset($current[$tag.'_attr']); 
                         } 
                         if($attributes_data) { 
                            $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; 
                         } 
                     } 
                    $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken 
                } 
             } 
         } elseif($type == 'close') { //End of tag '</tag>' 
            $current = &$parent[$level-1]; 
         } 
     } 
     return($xml_array); 
} 
?>

函数描述及例子:
$arr = xml2array(file_get_contents("tools.xml"),1,'attribute');

PHP 相关文章推荐
PHP+DBM的同学录程序(2)
Oct 09 PHP
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
cakephp打印sql语句的方法
Feb 13 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
Symfony2创建页面实例详解
Mar 18 PHP
利用php绘制饼状图的实现代码
Jun 07 #PHP
PHP自定义大小验证码的方法详解
Jun 07 #PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 #PHP
利用php获取服务器时间的实现代码
Jun 07 #PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 #PHP
PHP5常用函数列表(分享)
Jun 07 #PHP
深入理解php的MySQL连接类
Jun 07 #PHP
You might like
个人站长制做网页常用的php代码
2007/03/03 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php中的比较运算符详解
2013/10/28 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php实现微信支付之退款功能
2018/05/30 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
简单实现jquery隔行变色
2017/11/09 jQuery
node使用promise替代回调函数
2018/05/07 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
初中生自我评价
2014/02/01 职场文书
房屋租赁意向书
2014/04/01 职场文书
工作求职自荐信
2014/06/13 职场文书
党支部特色活动方案
2014/08/20 职场文书
党建工作汇报材料
2014/12/24 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
go goth封装第三方认证库示例详解
2022/08/14 Golang