`
wangshaofei
  • 浏览: 285117 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

将xml文件转换成以为数组

    博客分类:
  • php
阅读更多
<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

class XmlToArray {

    function __construct() {
        
    }

    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;
    }

}

?>


<?php
/**
 *用递归法将返回的多维数组存进一维数组
 */

    function datatosession($array) {
        foreach ($array as $key => $value) {
            if (is_array($value) && $value != null) {
                $this->datatosession($value);
            } else {
                if (is_string($value)) {
                    $_SESSION["$key"] = $value;
                }
            }
        }
    }

 ?>
 
1
1
分享到:
评论
1 楼 lfsfxy9 2011-08-30  
太麻烦了吧....

相关推荐

    将xml文件转换成csv格式

    将XML文件转换为CSV格式是一项常见的任务,尤其在数据分析和数据迁移时。这种转换有助于简化数据处理,因为CSV文件通常更容易被各种分析工具和编程语言所支持。以下是一些关于如何进行XML到CSV转换的知识点: 1. **...

    将xml文件转换为txt格式文件(python)

    将xml文件转换为txt格式文件(python)

    XML转换成数组

    把XML数据转换成php数组形式。

    小米XML文件转Vcard.zip

    总的来说,从小米XML文件转VCard涉及到的技术点包括XML解析、数据映射、VCard规范以及文件转换。这一过程需要编程技能,尤其是对XML和VCard格式的理解。对于普通用户,可以寻找现成的转换工具,而对于开发者,编写...

    XML文件转成TXT文件

    在某些情况下,我们可能需要将XML文件转换为TXT文件,例如为了简化数据处理、减少文件大小或适应特定的应用需求。在C#环境下,Visual Studio 2008(VS08)提供了丰富的类库和API来处理这种转换。 首先,我们需要...

    xml转换数组、对象转数组

    php将对象转成数组,php将xml转成数组 一个自定义函数搞定纯原创。

    XML文件批量转换CSV文件工具.rar

    这个“XML文件批量转换CSV文件工具”是一款便捷的应用程序,设计用于将XML格式的数据转换成CSV(Comma Separated Values)格式。CSV是一种通用的、轻量级的文件格式,适合于导入和导出到各种数据分析和电子表格软件...

    将XML文件转换成对象,然后存到数据库中

    该文档主要详细描述了如何利用Dom4j技术、cglib技术,将xml存到数据库,具有一定的灵活性,例如表都不需要建,字段属性这些都是根据xml文件里的属性和值来确定的,当然这不是最精简的,还可以改进,相信自己用了之后...

    讲xml转换成代码

    因此,从XML转换为代码,通常是指将XML元素映射到类,属性映射到类的成员变量,而元素内容则可能对应于方法或变量的初始值。 在Delphi中,我们可以使用内置的XML处理库,如XMLDataModule或XMLDocument组件,来解析...

    xml文件转json

    xml转换为json的js库文件

    一个将数组转换为xml简单的PHP类

    但在这个简单的PHP类中,我们可以期待一个快速且易于使用的解决方案,适用于大多数基本的数组到XML转换需求。 总的来说,了解并能够灵活运用这个PHP类,不仅可以提高开发效率,还能帮助理解PHP如何处理XML数据,...

    《使用kettle把XML文档转换成数据表结构》附件

    2. 批处理:对于大量XML文件,可以使用“Job”来批量处理,将多个转换串联起来。 3. 性能优化:如果XML文件很大,可以考虑使用“XML输入流”代替“XML输入”,以提高性能。 4. 数据验证:在将数据加载到数据库之前,...

    java将xml串转换成Map类型

    将xml串转换成Map类型,如果有重复节点,自动转换为list类型存储,所以最终转换并非绝对Map

    PHP 将 XML文件或内容直接转成数组

    因此,如何有效地将XML转换为数组成为了一个常见的问题。 #### 核心知识点 1. **XML简介** - XML是一种标准的、开放的文件格式,被广泛应用于不同系统之间的数据交换。 - XML文件具有良好的自描述性和层次性,...

    xml文件自动转成java对象工具

    除了XSD转Java,有些工具还支持直接将XML文件转换为Java对象。这个过程涉及到XML解析,通常使用DOM(Document Object Model)、SAX(Simple API for XML)或者StAX(Streaming API for XML)等解析器。解析器读取XML...

    Object-XML文件的相互转换分析

    本篇将深入探讨Object-XML转换的相关知识点,并以Spring框架中的Object-XML映射为例进行详细解析。 首先,让我们理解Object-XML转换的基本概念。在Java中,我们将一个对象转换为XML的过程称为对象序列化,反之称为...

    PHP 数组与Xml转换

    在 PHP 中,数组和 XML 之间的转换是一种常见的需求,特别是在数据交换、存储或者解析 XML 文件时。本篇文章将深入探讨如何在 PHP 中实现数组到 XML 的转换,并提供两种不同的实现方式。 首先,我们来看第一种方法...

    C# 生成xml文件,编码为utf-8方法

    最后,使用 MemoryStream 对象的 ToArray 方法将 XML 数据转换为 byte 数组,然后使用 Encoding.UTF8.GetString 方法将其转换为 UTF-8 编码的字符串。 在上面的代码中,首先创建了一个 MemoryStream 对象,然后创建...

    xml文件转xsd文件

    将XML文件转换为XSD文件,主要是为了更好地管理和验证XML文档的结构,确保数据的一致性和准确性,同时也便于生成对应的Java类,以进行程序开发。 在Java开发中,经常需要处理XML数据。有了XSD文件,开发者可以使用...

    PHP查询xml,以数组返回

    如果XML元素有子元素,转换后的数组将包含子元素的数组。例如,如果`&lt;item&gt;`元素有`&lt;name&gt;`和`&lt;description&gt;`子元素,`$itemsArray`中的每个元素将如下所示: ```php [ 'name' =&gt; 'Item Name', 'description' =...

Global site tag (gtag.js) - Google Analytics