PHP中simpleXML递归实现XML文件与数组的相互转化(原创)

一、XML文件转换为数组
<?php

/*******************************************************/

//simpleXML  解析XML文件非常简单

//因为它一次性把XML文件解析成一个大对象

//来个简单的实例

/************************************************

//从文件载入XML文档

//$simxml  =  simplexml_load_file(‘book.xml‘);

//print_r($simxml);

//echo $simxml->book[1]->title;

//查看bokstore下面有几本书

//echo ‘有‘,$simxml->count(),"本书";
//echo  $simxml -> asXML ();

/*

//利用simplexml对象把xml文件转换成数组

//对象           用属性名->属性值            存储变量

//数组用键名->键值存储变量

//二者区别不大,js中可直接看成关联数组来操作

$simxml = simplexml_load_file(‘book.xml‘);

/*

print_r($simxml);

echo "<br/>";

//类型的强制转换

print_r(array($simxml));

*/

//写一个函数,递归把simpleXML对象转成数组

//思路:先把最外层对象转成数组,再循环转换

//某个单元只要还是对象,就继续调用自身来转换

function xml2arr($sim){

$arr = (array)$sim;

foreach($arr as $k=>$v){

if($v instanceof simplexmlelement || is_array($v)){   //判断是否为 simplexml 对象 或者 数组

$arr[$k] = xml2arr($v);

}

}

return $arr;

}

print_r($xmlarr = xml2arr($simxml));

echo $xmlarr[‘book‘][‘1‘][‘title‘];        //此时,便可直接对数组操作

?>
附上 我的 book.xml 内容:

<?xml version="1.0" encoding="utf-8"?>

<bookstore>

<book category="COOKING">

<title lang="en">Everyday Italian</title>

<author>Giada De Laurentis</author>

<year>2005</year>

<price>30</price>

</book>

<book category="武侠">

<title lang="中文">侠客行</title>

<author>金庸</author>

<year>2005</year>

<price>29.9</price>

</book>

<book category="网页">

<title lang="中文">PHP7日通</title>

<author>Lover雪</author>

<year>2003</year>

<price>30.99</price>

</book>

<book category="小说">

<title lang="en">离歌</title>

<author>美女作家</author>

<year>2001</year>

<price>49.99</price>

</book>

</bookstore>

二、数组转换为XML文件

废话不多说,先从简单的一维数组开始:
(1)、一维数组转换为xml

<?php

//一维数组转成XML

//************************************************

//一维数组转为xml

//*************************************************

//思路:循环数组中每个单元,加入到xml文档节点中

$arr = array(

‘name‘=>"lover雪",

‘content‘=>"我喜欢雪",

);

function arr2xml($arr){

//直接传值字符串

$simxml = new simpleXMLElement(‘<?xml version="1.0" encoding="utf-8" ?><root></root>‘);

foreach($arr as $k=>$v){

$simxml->addChild($k,$v);

}

return $simxml->saveXML();

}

header(‘content-type: text/xml‘);

echo ($str = arr2xml($arr));

file_put_contents(‘./01.xml‘,$str);

?>

接下来,我们在上面的代码中进行改变,用于多维数组

(2)、多维数组转换为xml

<?php

//多维数组转为xml

//思路:循环数组中每个单元,加入到xml文档节点中

$arr = array(

‘name‘=>"lover雪",

‘content‘=>"我喜欢雪",

‘job‘=>array(

‘title‘=>‘经理‘,

‘salary‘=>8888,

‘team‘=>array("lover雪","silence",‘hurts‘)

)

);

function arr2xml($arr,$node=NULL){

//直接传值字符串

if(is_null($node))

$simxml = new simpleXMLElement(‘<?xml version="1.0" encoding="utf-8" ?><root></root>‘);

else

$simxml = $node;

foreach($arr as $k=>$v){            //若是数组

if(is_array($v)){

arr2xml($v,$simxml->addChild($k));

}else if(is_numeric($k)){       //若节点名为数字,由于xml的标签不得有数字开头

$simxml->addChild(‘item‘.$k, $v);

}else{              //是字符串//if(is_scalar($v))//标量类型:bool  float  interage string

$simxml->addChild($k,$v);

}

}

return $simxml->saveXML();

}

header(‘content-type: text/xml‘);

echo ($str = arr2xml($arr));

file_put_contents(‘./01.xml‘,$str);

?>

上面的代码中个,在ar2xml中,首先在参数中,增加一个$node节点,作为当$arr为数组时的根节点使用,
若传入的$node 为空的话,则说明暂时还没有根节点,此事我们可以创建一个根节点,
否则,直接将后面创建的节点加入作为$node的子节点,

分三种情况进行讨论,分别是数组,数字,所有标量类型。
之所以单独把数字进行分类讨论,是因为,在xml中,标签是不可以以数字开头。

结果图如下:

最后将内容全部写入文件,此时会在当前目录下创建01.XML 文件。

时间: 2024-08-27 03:53:21

PHP中simpleXML递归实现XML文件与数组的相互转化(原创)的相关文章

Android中解析与创建XML文件

Android中解析与创建XML文件 在Android中对XML的操作有多种方式,常见的有三种方式:SAX.DOM和PULL方式. DOM方式会把整个XML文件加载到内存中,在PC上常使用DOM的方式. 但是在性能敏感的设备上,主要采用的是SAX的方式,但是缺点是嵌套多个分支的时候处理不是很方便. 而PULL的方式类似SAX方式,同样很节省内存. 因此,本文章中只提供PULL的方式解析与创建XML文件. 基础类 本例中使用的实体类的定义如下: public class CAddress impl

JAVA中使用DOM解析XML文件

JAVA中使用DOM解析XML文件: 创建DocumentBuilderFactory的对象                                 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 创建DocumentBuilder对象 通过documentBuilder对象的parser方法加载xml文件到当前项目下 获取所有XML文件内节点的集合    getElementsByTagName()方

java中采用dom4j解析xml文件

一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4j解析xml的具体操作. 二.代码详情    dom4j是一个第三方开发组开发出的插件,所以在我们使用dom4jf的时候我们要去下载一下dom4j对应版本的jar导入在我们项目中.  1)xml文件: <?xml version="1.0" encoding="UTF-8&

Matlab中使用脚本和xml文件自动生成bus模块

帮一个老师写的小工具 在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫 所以用xml配置文件来写,也便于更改总线数据接口,然后使用matlab脚本来生成BusObject和Bus模块库 以下代码运行环境:WIN10+Matlab2015a 下面给出代码Matlab函数的代码: function xmlbuscreator(xmlfile) % XMLBUSCREATOR:从xml文件读取数据结构,并生成

jquery递归遍历xml文件,形成ul-li序列,生成树结构(使用了treeview插件)

treeview插件从这里获得,下载的文件中有demo,看demo文件夹里面的index.html文件就差不多知道如何使用该控件了,在我做的项目里用到的部分代码截图如下(在引用下面的js文件前要先引用jquery文件): <div id="project_list1"> <ul id="browser" class="filetree"> <li><span class="folder"

如何在web.xml文件中引入其他的xml文件

最近在做一个Servlet+javaBean的项目,服务器用的是tomcat.因此,所有的页面都是servlet请求,而且很多,需要在web.xml文件中进行配置.导致web.xml文件特别大,而且这个系统以后会做大,并且会出现系统拆分,为了便于以后拆分,于是想到将web.xml文件中的servlet和servlet-mapping能够从web.xml脱离出来,用其他xml文件保存然后在web.xml文件中引入这些文件,就想类似引入struts.config一样.        在网上找了半天也

如何在FineReport中解析数据库内XML文件

在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中.那么在使用该表进行报表制作时,需要将存于xml字段中的值读取出来作为报表数据源. XML每条记录数据格式如下: <Field><Name>MemoryFreeSize</Name><Type>int</Type><Value>1962</Value></Field> <Field><Name>MemoryTotalS

MyBatis中SQL映射的XML文件

Mappers 既然MyBatis的行为已经由上篇介绍的MyBatis配置文件的元素配置完了,我们现在就要定义SQL映射语句了.但是,首先我们需要告诉MyBatis到哪里去找到这些配置.Java在这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis去哪里去找映射文件.你可以使用相对于类路径的资源引用,或者字符表示,或url应用的完全限定名. MyBatis架构中,POJOs对象对象一个映射器接口,映射器接口和对应的SQL映射的XML在同一包下. SQL映射的XML文件 MyBatis

java中利用dom4j解析XML文件

官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回List<Student>集合 需要解析的XML: <?xml version="1.0" encoding="UTF-8"?> <classes> <class name="ST01"> <stud