zoukankan      html  css  js  c++  java
  • 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 文件。
     
     
     
     


    图片




  • 相关阅读:
    什么叫精通C++
    编程好书推荐
    Reading Notes ofC Traps and Pitfalls
    继承的小问题
    关于strcpy函数
    #pragma once 与 #ifndef 的区别解析
    模板类的友元重载函数
    NET开发人员必知的八个网站
    获取MDI窗体的实例
    .Net下收发邮件第三方公共库
  • 原文地址:https://www.cnblogs.com/lihaiyan/p/4274359.html
Copyright © 2011-2022 走看看