一、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 ();
//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中,标签是不可以以数字开头。
若传入的$node 为空的话,则说明暂时还没有根节点,此事我们可以创建一个根节点,
否则,直接将后面创建的节点加入作为$node的子节点,
分三种情况进行讨论,分别是数组,数字,所有标量类型。
之所以单独把数字进行分类讨论,是因为,在xml中,标签是不可以以数字开头。
结果图如下:
最后将内容全部写入文件,此时会在当前目录下创建01.XML 文件。