<?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;
}
}
}
}
?>
分享到:
相关推荐
将XML文件转换为CSV格式是一项常见的任务,尤其在数据分析和数据迁移时。这种转换有助于简化数据处理,因为CSV文件通常更容易被各种分析工具和编程语言所支持。以下是一些关于如何进行XML到CSV转换的知识点: 1. **...
将xml文件转换为txt格式文件(python)
把XML数据转换成php数组形式。
总的来说,从小米XML文件转VCard涉及到的技术点包括XML解析、数据映射、VCard规范以及文件转换。这一过程需要编程技能,尤其是对XML和VCard格式的理解。对于普通用户,可以寻找现成的转换工具,而对于开发者,编写...
在某些情况下,我们可能需要将XML文件转换为TXT文件,例如为了简化数据处理、减少文件大小或适应特定的应用需求。在C#环境下,Visual Studio 2008(VS08)提供了丰富的类库和API来处理这种转换。 首先,我们需要...
php将对象转成数组,php将xml转成数组 一个自定义函数搞定纯原创。
这个“XML文件批量转换CSV文件工具”是一款便捷的应用程序,设计用于将XML格式的数据转换成CSV(Comma Separated Values)格式。CSV是一种通用的、轻量级的文件格式,适合于导入和导出到各种数据分析和电子表格软件...
该文档主要详细描述了如何利用Dom4j技术、cglib技术,将xml存到数据库,具有一定的灵活性,例如表都不需要建,字段属性这些都是根据xml文件里的属性和值来确定的,当然这不是最精简的,还可以改进,相信自己用了之后...
因此,从XML转换为代码,通常是指将XML元素映射到类,属性映射到类的成员变量,而元素内容则可能对应于方法或变量的初始值。 在Delphi中,我们可以使用内置的XML处理库,如XMLDataModule或XMLDocument组件,来解析...
xml转换为json的js库文件
但在这个简单的PHP类中,我们可以期待一个快速且易于使用的解决方案,适用于大多数基本的数组到XML转换需求。 总的来说,了解并能够灵活运用这个PHP类,不仅可以提高开发效率,还能帮助理解PHP如何处理XML数据,...
2. 批处理:对于大量XML文件,可以使用“Job”来批量处理,将多个转换串联起来。 3. 性能优化:如果XML文件很大,可以考虑使用“XML输入流”代替“XML输入”,以提高性能。 4. 数据验证:在将数据加载到数据库之前,...
将xml串转换成Map类型,如果有重复节点,自动转换为list类型存储,所以最终转换并非绝对Map
因此,如何有效地将XML转换为数组成为了一个常见的问题。 #### 核心知识点 1. **XML简介** - XML是一种标准的、开放的文件格式,被广泛应用于不同系统之间的数据交换。 - XML文件具有良好的自描述性和层次性,...
除了XSD转Java,有些工具还支持直接将XML文件转换为Java对象。这个过程涉及到XML解析,通常使用DOM(Document Object Model)、SAX(Simple API for XML)或者StAX(Streaming API for XML)等解析器。解析器读取XML...
本篇将深入探讨Object-XML转换的相关知识点,并以Spring框架中的Object-XML映射为例进行详细解析。 首先,让我们理解Object-XML转换的基本概念。在Java中,我们将一个对象转换为XML的过程称为对象序列化,反之称为...
在 PHP 中,数组和 XML 之间的转换是一种常见的需求,特别是在数据交换、存储或者解析 XML 文件时。本篇文章将深入探讨如何在 PHP 中实现数组到 XML 的转换,并提供两种不同的实现方式。 首先,我们来看第一种方法...
最后,使用 MemoryStream 对象的 ToArray 方法将 XML 数据转换为 byte 数组,然后使用 Encoding.UTF8.GetString 方法将其转换为 UTF-8 编码的字符串。 在上面的代码中,首先创建了一个 MemoryStream 对象,然后创建...
将XML文件转换为XSD文件,主要是为了更好地管理和验证XML文档的结构,确保数据的一致性和准确性,同时也便于生成对应的Java类,以进行程序开发。 在Java开发中,经常需要处理XML数据。有了XSD文件,开发者可以使用...
如果XML元素有子元素,转换后的数组将包含子元素的数组。例如,如果`<item>`元素有`<name>`和`<description>`子元素,`$itemsArray`中的每个元素将如下所示: ```php [ 'name' => 'Item Name', 'description' =...