注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

...

 
 
 

日志

 
 

php把xml文件解析为数组完整示例  

2017-11-07 19:17:06|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

$filepath = "test.xml";

$arr = xml2array($filepath);
//var_dump($arr);

echo "<li>".$arr['root']['itemtype_cn_name']."</li>";
echo "<li>".$arr['root']['itemtype_en_name']."</li>";
echo "<li>".$arr['root']['itemtype_ver']."</li>";
echo "<li>".$arr['root']['publish_date']."</li>";
echo "<li>".$arr['root']['product_code']."</li>";
echo "<li>".$arr['root']['parent_product_code']."</li>";
echo "<li>".$arr['root']['target_range']."</li>";
echo "<li>".$arr['root']['remark']."</li>";
echo "<li>".$arr['root']['remark_attr']['attr-1']."</li>";
echo "<li>".$arr['root']['remark_attr']['attr-2']."</li>";
echo "<li>".$arr['root']['itemtype_cn_name']."</li>";

echo "<li>".$arr['root']['itemtype_directory']."</li>";
echo "<li>".$arr['root']['itemtype_js_filename']."</li>";





echo "<li>".$arr['root']['file_list']['item'][0]['title']."</li>";
echo "<li>".$arr['root']['file_list']['item'][0]['type']."</li>";
echo "<li>".$arr['root']['file_list']['item'][0]['path']."</li>";


echo "<li>".$arr['root']['file_list']['item'][1]['title']."</li>";
echo "<li>".$arr['root']['file_list']['item'][1]['type']."</li>";
echo "<li>".$arr['root']['file_list']['item'][1]['path']."</li>";

echo "<li>".$arr['root']['file_list']['item'][2]['title']."</li>";
echo "<li>".$arr['root']['file_list']['item'][2]['type']."</li>";
echo "<li>".$arr['root']['file_list']['item'][2]['path']."</li>";

echo "<li>".$arr['root']['file_list']['item'][3]['title']."</li>";
echo "<li>".$arr['root']['file_list']['item'][3]['type']."</li>";
echo "<li>".$arr['root']['file_list']['item'][3]['path']."</li>";


function xml2array($url, $get_attributes = 1, $priority = 'tag')
{
    $contents = "";
    if (!function_exists('xml_parser_create'))
    {
        return array ();
    }
    $parser = xml_parser_create('');
    if (!($fp = @ fopen($url, 'rb')))
    {
        return array ();
    }
    while (!feof($fp))
    {
        $contents .= fread($fp, 8192);
    }
    fclose($fp);
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    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...
    $xml_array = array ();
    $parents = array ();
    $opened_tags = array ();
    $arr = array ();
    $current = & $xml_array;
    $repeated_tag_index = array (); 
    foreach ($xml_values as $data)
    {
        unset ($attributes, $value);
        extract($data);
        $result = array ();
        $attributes_data = array ();
        if (isset ($value))
        {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value;
        }
        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'
            }
        }
        if ($type == "open")
        { 
            $parent[$level -1] = & $current;
            if (!is_array($current) or (!in_array($tag, array_keys($current))))
            {
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                $current = & $current[$tag];
            }
            else
            {
                if (isset ($current[$tag][0]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                { 
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    ); 
                    $repeated_tag_index[$tag . '_' . $level] = 2;
                    if (isset ($current[$tag . '_attr']))
                    {
                        $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")
        {
            if (!isset ($current[$tag]))
            {
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            }
            else
            {
                if (isset ($current[$tag][0]) and is_array($current[$tag]))
                {
                    $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
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    ); 
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes)
                    {
                        if (isset ($current[$tag . '_attr']))
                        { 
                            $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')
        {
            $current = & $parent[$level -1];
        }
    }
    return ($xml_array);
}


test.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
    <itemtype_cn_name>文本组件</itemtype_cn_name><!--组件的中文名-->
    <itemtype_en_name>htmlmodel</itemtype_en_name><!--组件的英文名,区别大小写-->
    <itemtype_ver>2.0</itemtype_ver><!--组件的版本号-->
    <publish_date>2017-10-1</publish_date><!--发布日期-->
    <product_code>10111</product_code><!--产品编号-->
    <parent_product_code>100</parent_product_code><!--父产品编号(系统编号)-->
    <target_range>0</target_range><!--0通用版,1定制版-->
    <remark attr-1='这是属性1' attr-2='这是属性2'>这是xml文件中自带的说明</remark>

    <itemtype_directory>timeComp</itemtype_directory><!--组件目录-->
    <itemtype_js_filename>timeComp.js</itemtype_js_filename><!--组件的js文件-->

    <file_list>
        <item>
            <title>标题1</title>
            <type>路径1</type>
            <path>dir1</path>
        </item>
        <item>
            <title>标题2</title>
            <type>路径2</type>
            <path>file2</path> 
        </item>
        <item>
            <title>标题3</title>
            <type>路径3</type>
            <path>file3</path>
        </item>
        <item>
            <title>标题4</title>
            <type>路径4</type>
            <path>file4</path>
        </item>
    </file_list>
</root>

  评论这张
 
阅读(15)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017