首页 > 编程语言 > 详细

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

时间:2015-02-05 13:01:58      阅读:303      评论:0      收藏:0      [点我收藏+]

 一、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 文件。
 
 
 
 


技术分享




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

原文:http://www.cnblogs.com/lihaiyan/p/4274359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!